Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Você deve acrescentar pelo menos um parágrafo sobre depuração. O artigo menciona uma situação em que o AV pode ocorrer, mas mesmo deixando de lado o mar de outras possíveis fontes de erros, tentar procurar manualmente (a olho nu ou mentalmente) o local do erro pode levar muito tempo e não ter sucesso.
Obrigado por seu comentário. Acho que essa seção pode ser expandida para incluir os erros mais populares. No entanto, para evitar a busca de erros "longa e sem sucesso", faça tudo como está escrito no artigo. Os exemplos contidos nele são viáveis. Além disso, use o depurador no MetaEditor, ele é bastante decente, com depuração passo a passo e pontos de interrupção!
Neste artigo, não quero ensinar ninguém a programar. Se alguém cometer erros elementares e depois gritar bem alto, , talvez ele não deva criar suas próprias DLLs ainda e começar a aprender a parte do tapete.
Olá, HideYourRichess.
Você é muito rápido! Você escreveu tanto! Você deveria escrever seus próprios artigos sobre o Delphi.
Tentarei responder brevemente e em ordem:
1. Юниты SysUtils и Classes нужно было оставить в проекте.
Os SysUtils estão no projeto! As classes não têm nada a fazer! O manipulador de exceções, além do SysUtils, é implementado no System, que está conectado por padrão, portanto, não vejo motivo para preocupação.
2. Você não deve usar todos os tipos de procedimentos no DllEntryPoint (também conhecido como DllMain).
O exemplo do DllEntryPoint está em toda parte na Internet. Essa é uma forma padrão de criar eventos de DLL, aos quais, por exemplo, você pode vincular a alocação e a liberação de memória do heap. Se você tiver erros reais com esse método de trabalhar com a memória, estou pronto para considerá-los.
Não discuto sobre tudo o mais que não pode ser feito no DllEntryPoint, porque não o utilizo com frequência.
3. Você escreveu muito sobre o gerenciador de memória. Destacarei apenas sua conclusão:
Portanto, você pode fazer com que a DLL e o aplicativo tenham um único gerenciador de memória, e ele será o gerenciador de memória do MT4.
O problema é que nenhum de nós sabe como funciona o gerenciador de memória do MT5(MT4). E mesmo que soubéssemos os nomes das funções que implementam esse gerenciador, como você poderia usá-lo, pois a API do MT5está fechada! Portanto, a ideia de um único gerenciador e DLL para o MT5 é uma utopia.
Para não confundir os leitores, sugiro usar a técnica clássica de manipulação de memória implementada nas funções da API. Ela é descrita no artigo na seção de trabalho com strings.
Conto com o fato de que, em vez de citar livros e artigos da Delphi aqui, o autor do artigo receberá reclamações apenas em relação ao que realmente não funciona a partir do que está descrito no artigo. De preferência com exemplos.
Obrigado por seu comentário. Acho que essa seção pode ser expandida para incluir os erros mais populares. Entretanto, para não ter que procurar erros "longa e infrutiferamente", faça tudo como está escrito no artigo. Os exemplos contidos nele são viáveis. Além disso, use o depurador no MetaEditor, ele é bastante decente, com depuração passo a passo e pontos de interrupção!
Neste artigo, não quero ensinar ninguém a programar. Se alguém cometer erros elementares e depois gritar bem alto, , talvez ele não deva criar suas próprias DLLs ainda e começar a aprender a parte do tapete.
Infelizmente, você está muito enganado. Não apenas aqueles que estão aprendendo a programar cometem erros - tanto elementares quanto não tão elementares - mas também programadores experientes.
Isso não tem nada a ver com a matemática, mas com as ferramentas de depuração. Vamos nos lembrar da conhecida estatística "80 por 20": 80% do tempo é gasto na depuração e apenas 20% na escrita do código. Pelo que entendi, o objetivo do artigo é ensiná-lo a escrever uma DLL funcional, ou seja, não apenas o exemplo específico dado, mas também um outro código hipotético. É claro que é impossível considerar todos os possíveis erros, mas precisamos de informações sobre como detectá-los em princípio. Caso contrário, os leitores não poderão fazer nada além de reproduzir o exemplo.
O MetaEditor também não tem nada a ver com isso, pois estamos falando de depurar a DLL, ou seja, seus componentes internos.
Você é o autor - você sabe melhor. Eu apenas expressei minha opinião sobre algumas incompletudes na apresentação.
Esses são trechos de um artigo antigo sobre dlls para mt4, inacabado. Eu apenas copiei os trechos aqui. Não é difícil e não é longo.
"Os SysUtils estão no projeto! As classes não têm nada a ver com isso! O manipulador de exceções além do SysUtils é implementado no System, que é conectado por padrão, portanto, não vejo motivo para se preocupar. "
Fica a critério do proprietário quais unidades incluir. Mas acho que é necessário especificar o motivo. Nesse caso, SysUtils e Classes são recomendados pela Borland. E há razões para isso.
"O exemplo com DllEntryPoint é dado na Internet em todos os cantos. Essa é uma maneira padrão de criar eventos de DLL, para os quais, por exemplo,"
A Borland não escondeu o DllMain de mãos maliciosas por acidente. A maneira padrão de criar uma DLL no Delphi é com um DllMain oculto. Pense por que isso acontece. E leia o que a própria Microsoft recomenda.
"Você pode vincular a alocação e a liberação de memória a partir do heap. Se você tiver erros reais com esse método de trabalhar com a memória, estou pronto para considerá-lo."
Isso é com você. Mas minha recomendação é que nada seja feito no DllMain.
"O problema é que nenhum de nós sabe como funciona o gerenciador de memória no MT5(MT4). E mesmo que soubéssemos os nomes das funções que implementam esse gerenciador, como você poderia usá-lo, pois a API do MT5está fechada! Portanto, a ideia de um único gerenciador e DLL para o MT5 é uma utopia."
;-) para alguém é "fechado" e "utopia" - e para outra pessoa "tudo funciona". estamos falando do 4. Não dei uma olhada no 5.
Deve-se mencionar que há uma alternativa ao uso do Delphi.
Se você ainda não é usuário do Delphi, deve considerar o uso do Lazarus/FPC. Ele é de código aberto, tem quase os mesmos recursos do Delphi (e até mais alguns), é amplamente compatível com o código-fonte do Delphi e eu até apostaria que todos os exemplos acima compilam no Lazarus sem nenhuma modificação.
Se você prefere código-fonte aberto em vez de software proprietário (o que é algo que você deve fazer de qualquer forma), então o Lazarus é o que você está procurando e não uma versão comercial de teste do Delphi.
Há um procedimento desse tipo no artigo:
O compilador me pergunta o que é a variável não declarada BUFFER_SIZE.
Você poderia me dizer o que ela realmente deveria ser, onde deveria ser declarada e de que buffer se trata?
O compilador me pergunta qual é a variável não declarada BUFFER_SIZE.
Você poderia me dizer o que deve estar lá e onde deve ser declarada e de que buffer estamos falando?
No arquivo de projeto dll_mql5.dpr , há a seguinte declaração
const BUFFER_SIZE = 255;
Por uma linha de código
Buffer:=AllocMem(BUFFER_SIZE);
a memória para armazenar a string é alocada no heap.
E o próprio ponteiro do buffer é usado na função GetStringBuffer, que demonstra o trabalho com strings.
Ajuda com a DLL
Alguém pode me ajudar? Podemos usar o arquivo DLL do MT4 no MT5 e, em caso afirmativo, onde instalá-lo no MT5 e qualquer outra coisa que eu precise saber.
Além disso, em qual pasta armazenamos o arquivo DLL?
Não tenho mais o código da DLL, portanto, não posso mais reescrevê-lo.
Qualquer sugestão ou ajuda será bem-vinda.
Ao conectar o Expert Advisor no MT5, recebo o erro "dll is not 64-bit version" (a dll não é uma versão de 64 bits).
Existe alguma maneira de usar a dll de 32 bits?
Caso contrário, alguém pode me dizer como compilar uma dll de 64 bits no Delphi XE?
Como compilar uma dll de 64 bits no Delphi XE?