Ajuda a resolver um problema de importação de uma função a partir de uma dll

 

Eu quero aprender como importar funções da dll. Eu tentei variantes diferentes, mas o seguinte erro continua surgindo: não é possível chamar a função da dll (erro 127).

1. Eu tentei compilar meu projeto no C++ Builder 6.

2. mesmo projeto em C++ Builder 2009.

3. Eu criei um projeto a partir do exemplo DLLS em C++ Builder 2009, compilando-o.

O mesmo resultado em todos os lugares: não pode chamar a função da dll (erro 127).

Para testá-lo, eu uso o script com PExpDll.dll - biblioteca compilada em C++ Builder 2009 do exemplo DLLSample, que vem com MetaTrader 4.

Aqui está este roteiro:

#direitos autorais "Copyright © 2008, MetaQuotes Software Corp."
#link da propriedade "https://www.metaquotes.net//"

#importar "PExpDll.dll"
int GetIntValue(int);
duplo GetDoubleValue(duplo);
string GetStringValue(string);
#importar

//+------------------------------------------------------------------+
//| função de início do programa de script |
//+------------------------------------------------------------------+
int start()
{
//----
Imprimir ("Script start");
GetStringValue("Será que isto vai funcionar?");
GetIntValue(10);

//----
retorno(0);
}
//+------------------------------------------------------------------+

Por favor, ajude-me, diga-me o que estou fazendo de errado...?

Agradecemos antecipadamente.

 

Opção 1) descobrir onde colocar o arquivo def. Sem ele, você provavelmente não chegará a lugar algum.

Opção 2) instalar o Visual Studio

 

LOL

opção 3:

existem testadores, pelo menos da VB excel - verifique se a função solicitada é chamada.

Se não - más configurações do linker, sim - não um erro na descrição do MQL

Com a instalação do MT4, uma boa DLL de fonte C é entregue - utilize-a para treinamento, economizará muito tempo.

 
boysn >> :

#importar "PExpDll.dll"
int GetIntValue(int);
duplo GetDoubleValue(duplo);
string GetStringValue(string);
#importar

De acordo com as regras de declaração de função na MQL-4, você tem um erro claro:

int GetIntValue(int X);
double GetDoubleValue(double X);
string GetStringValue(string X);

Não há nome de parâmetro de entrada, apenas tipo. Isto não é permitido na MQL-4.

 
Urain >> :

De acordo com as regras de declaração de função na MQL-4, há um erro gritante:

Não há nome de parâmetro de entrada, apenas tipo. Na MQL-4 não é permitido.

O que o compilador não pragueja, você pode.

Eu tentei escrevê-lo desta maneira:

#import "timeService.dll"
// функция, выдающее смещение от Utc 
// до времени сервера и до локального времени
int timeService(
  string , //  <--- убрал имя переменной
  int & utcToServer[],
  int & utcToLocal[]  );
#import

Tudo funciona bem.

Na verdade, de acordo com os cânones C e C++, não é necessário especificar os nomes dos parâmetros.

Além disso, na maioria dos casos o programador está ocupado sentado e comentando sobre eles.

 

Muito obrigado por seus conselhos, obrigado por responder.

1. No MT4 eu tenho a opção Service-Settings-Advisors-Confirm call of dll functions assinalada. Então, quando eu faço script, ele me pergunta se eu deveria chamar tal função...? Eu seleciono "Sim" e então vem o seguinte erro: não é possível chamar a função da dll (erro 127).

2. E as declarações de funções sem parâmetros como o duplo GetDoubleValue(duplo), está escrito assim nas amostras, especialmente porque o compilador não reclama sobre isso, então está tudo bem.

3. Mas e o def-file... Claro, talvez seja por causa do def-file, mas eu realmente não sei onde colocá-lo. Nos projetos C++ Builder 6 e 2009 não existem tais arquivos com tal extensão, ou seja, ao construir a dll em si, parece não haver onde colocá-la. Na mesma pasta com o mesmo nome na pasta de especialistas {\i1}MetaTrader 4\i}libraries não é a mesma... experimentou... Em resumo, não está claro. Tentei outro exemplo onde um sistema dll pronto é usado

#importar "kernel32.dll
int _lopen (caminho de cordas, int de);
int _lcreat (caminho de cordas, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle);
#importar

Estas funções são chamadas. A razão para a amostragem DLLS não é clara.
Se a razão está no Linker, qual pode ser? Parece que estou tornando o arquivo autônomo.

Uh... sim... eu não entendo. O exemplo no MT4 está funcionando com certeza? Alguém verificou para ver se funciona?

Obrigado a todos vocês por responderem e responderem.

 
Como passar os parâmetros das cordas e dar o resultado no mesmo tipo? Bilder tem peculiaridades ao lidar com cordas...
 
boysn >> :

{...} 3. Quanto ao arquivo def... É claro que pode ser por causa disso, mas não está realmente claro onde colocá-lo. Nos projetos C++ Builder 6 e 2009 não existem tais arquivos com esta extensão, ou seja, quando se constrói a dll em si, parece não haver onde colá-la. Na mesma pasta com o mesmo nome na pasta de especialistas {\i1}MetaTrader 4\i}libraries não é a mesma... experimentou... Em resumo, não está claro. Tentei outro exemplo que usa um sistema pronto dll {...}

Estas funções são chamadas... A razão para a amostragem DLLS não é clara.
Se a razão está no Linker, qual poderia ser? Parece que estou tornando o arquivo autônomo.

M...sim...não está claro. O exemplo no MT4 tem certeza de que funciona? Alguém já o testou para ver se funciona?

Obrigado a todos vocês por responderem e responderem.

1) embora o construtor seja ahem... "ligeiramente" errado, o arquivo def ainda é necessário

2) Você já tentou instalar o Visual Studio?

3) exemplo de obra. construtor errado.

 
jartmailru >> :

1) apesar de o construtor ser ahem... "ligeiramente" errado, o arquivo def ainda é necessário

2) você ainda não tentou o Visual Studio

3) exemplo de obra. construtor errado.

eu realmente fiz dlls para mt4 em bilder, def-file não foi útil...

 
boysn >> :

Se Linker é a causa, o que poderia estar lá? Pareço tornar o arquivo autônomo.


você pode tirar uma foto da tela do Compiler Linker e das abas do Compiler Linker e Packages das configurações do projeto?

 
alsu >> :

Eu costumava fazer dlls para mt4 no dibilder, o def-file não era útil...

Compartilhe um exemplo com um colega :-).

Talvez você precise escrever algum rabisco antes de declarar sua função ali.

.

E mais bilder... Eu ainda tenho uma cópia de 6 com 4 pacotes de serviços.

Deixou de usá-lo depois de um caso engraçado :-).

Quando eu adiciono uma função a um arquivo .cpp, recebo todo tipo de falhas :-).

As falhas consistiam em que o construtor mentiria sobre os parâmetros passados para a função através da pilha.

Você apaga a função - tudo está bem novamente.

Também posso lembrar variáveis globais que são acessíveis apenas a partir de um módulo,

onde são declarados, e do resto você vê lixo :-).