Aiuto per risolvere un problema con l'importazione di una funzione da una dll

 

Voglio imparare come importare funzioni da dll. Ho provato diverse varianti, ma continua ad apparire il seguente errore: cannot call function from dll (error 127).

1. Ho provato a compilare il mio progetto in C++ Builder 6.

2. stesso progetto in C++ Builder 2009.

3. Ho creato un progetto dall'esempio DLLSample in C++ Builder 2009, l'ho compilato.

Stesso risultato ovunque: impossibile chiamare la funzione dalla dll (errore 127).

Per testarlo, uso lo script con PExpDll.dll - libreria compilata in C++ Builder 2009 dall'esempio DLLSample, che viene fornito con MetaTrader 4.

Ecco questo script:

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#proprietà link "https://www.metaquotes.net//"

#importare "PExpDll.dll"
int GetIntValue(int);
doppio GetDoubleValue(double);
stringa GetStringValue(stringa);
#importare

//+------------------------------------------------------------------+
//| funzione di avvio del programma script |
//+------------------------------------------------------------------+
int start()
{
//----
Stampa("Inizio script");
GetStringValue("Mi chiedo se questo funzionerà?");
GetIntValue(10);

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

Per favore aiutatemi, ditemi cosa sto sbagliando...?

Grazie in anticipo.

 

Opzione 1) capire dove mettere il file def. Senza di essa, probabilmente non arriverai da nessuna parte.

Opzione 2) installare Visual Studio

 

LOL

opzione 3:

ci sono dei tester, almeno da VB excel - controlla che la funzione richiesta sia chiamata.

Se no - cattive impostazioni del linker, sì - non un errore nella descrizione MQL

Con l'installazione di MT4, viene consegnata una buona DLL sorgente C - usatela per la formazione, risparmierà molto tempo.

 
boysn >> :

#importare "PExpDll.dll"
int GetIntValue(int);
doppio GetDoubleValue(double);
stringa GetStringValue(stringa);
#importare

Secondo le regole della dichiarazione di funzione in MQL-4, avete un chiaro errore:

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

Non c'è il nome del parametro di input, solo il tipo. Questo non è permesso in MQL-4.

 
Urain >> :

Secondo le regole della dichiarazione di funzione in MQL-4, c'è un errore clamoroso:

Non c'è il nome del parametro di input, solo il tipo. In MQL-4 non è permesso.

Quello che il compilatore non giura, lo puoi fare tu.

Ho provato a scriverlo in questo modo:

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

Tutto funziona bene.

In realtà, secondo i canoni di C e C++, non è necessario specificare i nomi dei parametri.

Inoltre, nella maggior parte dei casi il programmatore è impegnato a sedersi e a commentarli.

 

Grazie mille per i vostri consigli, grazie per aver risposto.

1. In MT4 ho spuntato Service-Settings-Advisors-Confirm call of dll functions. Quindi, quando eseguo lo script, mi chiede se devo chiamare tale funzione...? Seleziono "Yes" e poi segue un errore: cannot call function from dll (error 127).

2. Che dire delle dichiarazioni di funzioni senza parametri come GetDoubleValue(double), è scritto così negli esempi, soprattutto perché il compilatore non se ne lamenta, quindi è ok.

3. Ma per quanto riguarda il def-file... Certo, forse è a causa di def-file, ma non so davvero dove metterlo. Nei progetti C++ Builder 6 e 2009 non ci sono file con tale estensione, cioè quando si costruisce la dll stessa non sembra esserci nessun posto dove metterla. Nella stessa cartella con lo stesso nome in \MetaTrader 4\experts\libraries la cartella non è la stessa... provato... In breve, non è chiaro. Provato un altro esempio in cui viene usata una dll di sistema già pronta

#importare "kernel32.dll"
int _lopen (percorso stringa, int di);
int _lcreat (percorso stringa, 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);
#importare

Queste funzioni sono chiamate. La ragione di DLLSample non è chiara.
Se la ragione è nel Linker, cosa può essere? Sembra che io stia facendo il file standalone.

Uh... sì... non capisco. L'esempio in MT4 funziona sicuramente? Qualcuno l'ha controllato per vedere se funziona?

Grazie a tutti voi per aver risposto e rispondere.

 
Come si fa a passargli dei parametri stringa e dare il risultato nello stesso tipo? Bilder ha delle particolarità quando si tratta di stringhe...
 
boysn >> :

{...} 3. Per quanto riguarda il file def... Certo, forse è per questo, ma non si capisce bene dove metterlo. Nei progetti C++ Builder 6 e 2009 non ci sono file di questo tipo con questa estensione, cioè quando si costruisce la dll stessa non sembra esserci nessun posto dove metterla. Nella stessa cartella con lo stesso nome in \MetaTrader 4\experts\libraries la cartella non è la stessa... provato... In breve, non è chiaro. Provato un altro esempio che usa una dll di sistema già pronta {...}

Queste funzioni sono chiamate... La ragione di DLLSample non è chiara.
Se la ragione è nel Linker, cosa potrebbe essere? Sembra che io stia facendo il file standalone.

M...sì...non è chiaro. L'esempio in MT4 è sicuro che funzioni? Qualcuno l'ha testato per vedere se funziona?

Grazie a tutti voi per aver risposto e rispondere.

1) anche se il costruttore è ahem... "leggermente" sbagliato, il file def è ancora necessario

2) Hai già provato a installare Visual Studio?

3) l'esempio funziona. costruttore sbagliato.

 
jartmailru >> :

1) anche se il costruttore è ahem... "leggermente" sbagliato, il file def è ancora necessario

2) non hai ancora provato Visual Studio

3) l'esempio funziona. costruttore sbagliato.

In realtà ho fatto le DLL per mt4 su bilder, il def-file non era utile...

 
boysn >> :

Se Linker è la causa, cosa potrebbe esserci? Mi sembra di rendere il file standalone.


puoi fare uno screenshot delle schede Compiler Linker e Packages delle impostazioni del progetto?

 
alsu >> :

Facevo le DLL per mt4 su dibilder, il def-file non era utile...

Condividi un esempio con un collega :-).

Forse hai bisogno di scrivere qualche ghirigoro prima della dichiarazione della funzione lì.

.

E bilder... Ho ancora una copia del 6 con 4 service pack.

Ho smesso di usarlo dopo un caso divertente :-).

Quando aggiungo una funzione a un file .cpp, ottengo ogni sorta di glitch :-).

I difetti consistevano nel fatto che il costruttore mentiva sui parametri passati nella funzione attraverso lo stack.

Cancellate la funzione - tutto è di nuovo a posto.

Posso anche ricordare le variabili globali che sono accessibili solo da un modulo,

dove sono dichiarati, e dal resto si vede la spazzatura :-).

Motivazione: