Aide à résoudre un problème d'importation d'une fonction depuis une dll

 

Je veux apprendre comment importer des fonctions à partir d'une dll. J'ai essayé différentes variantes, mais l'erreur suivante continue de s'afficher : cannot call function from dll (error 127).

1. J'ai essayé de compiler mon projet dans C++ Builder 6.

2. Même projet en C++ Builder 2009.

3. J'ai créé un projet à partir de l'exemple DLLSample en C++ Builder 2009, je l'ai compilé.

Même résultat partout : impossible d'appeler la fonction depuis la dll (erreur 127).

Pour le tester, j'utilise le script avec PExpDll.dll - bibliothèque compilée en C++ Builder 2009 à partir de l'exemple DLLSample, qui est fourni avec MetaTrader 4.

Voici ce script :

#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#lien de propriété "https://www.metaquotes.net//"

#import "PExpDll.dll"
int GetIntValue(int) ;
double GetDoubleValue(double) ;
string GetStringValue(string) ;
#import

//+------------------------------------------------------------------+
//| fonction de démarrage du programme de script |
//+------------------------------------------------------------------+
int start()
{
//----
Print("Début du script") ;
GetStringValue("Je me demande si ça va marcher ?") ;
GetIntValue(10) ;

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

S'il vous plaît, aidez-moi, dites-moi ce que je fais mal... ?

Merci d'avance.

 

Option 1) trouver où placer le fichier def. Sans elle, vous n'arriverez probablement à rien.

Option 2) installer Visual Studio

 

LOL

option 3 :

il y a des testeurs, au moins de VB excel - vérifier que la fonction demandée est appelée.

Si non - mauvais réglages du linker, oui - pas d'erreur dans la description MQL

Avec l'installation de MT4, une bonne DLL source C est livrée - utilisez-la pour la formation, elle vous fera gagner beaucoup de temps.

 
boysn >> :

#import "PExpDll.dll"
int GetIntValue(int) ;
double GetDoubleValue(double) ;
string GetStringValue(string) ;
#import

Selon les règles de déclaration de fonction dans MQL-4, vous avez une erreur claire :

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

Il n'y a pas de nom de paramètre d'entrée, seulement le type. Ceci n'est pas autorisé dans MQL-4.

 
Urain >> :

Selon les règles de déclaration des fonctions dans MQL-4, il y a une erreur flagrante :

Il n'y a pas de nom de paramètre d'entrée, seulement le type. Dans MQL-4, cela n'est pas autorisé.

Ce que le compilateur ne jure pas, vous pouvez le faire.

J'ai essayé de l'écrire comme ça :

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

Tout fonctionne bien.

En fait, selon les canons du C et du C++, il n'est pas du tout nécessaire de spécifier les noms des paramètres.

de plus, dans la plupart des cas, le programmeur est occupé à s'asseoir et à les commenter.

 

Merci beaucoup pour vos conseils, merci d'avoir répondu.

1. Dans MT4, j'ai coché la case Service-Settings-Advisors-Confirm call of dll functions. Ainsi, lorsque je lance le script, il me demande si je dois appeler telle fonction... ? Je sélectionne "Oui" et une erreur s'ensuit : cannot call function from dll (error 127).

2. Qu'en est-il des déclarations de fonctions sans paramètres comme double GetDoubleValue(double), c'est écrit ainsi dans les exemples, d'autant plus que le compilateur ne s'en plaint pas, donc c'est ok.

3. mais qu'en est-il du fichier def... Bien sûr, c'est peut-être à cause de def-file, mais je ne sais vraiment pas où le mettre. Dans les projets C++ Builder 6 et 2009, il n'y a pas de tels fichiers avec une telle extension, c'est-à-dire que lors de la construction de la dll elle-même, il semble n'y avoir aucun endroit où la placer. Dans le même dossier, sous le même nom, dans le dossier \MetaTrader 4\experts\libraries n'est pas le même... l'a essayé... En bref, ce n'est pas clair. J'ai essayé un autre exemple où une dll système prête à l'emploi est utilisée.

#import "kernel32.dll"
int _lopen (string path, int of) ;
int _lcreat (string path, 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) ;
#import

Ces fonctions sont appelées. La cause de DLLSample n'est pas claire.
Si la raison se trouve dans le Linker, qu'est-ce que cela peut être ? Il semble que le fichier soit autonome.

Euh... ouais... je ne comprends pas. Et l'exemple dans MT4 est sûr de fonctionner ? Quelqu'un l'a-t-il vérifié pour voir s'il fonctionne ?

Merci à tous de répondre et de réagir.

 
Comment lui passer des paramètres de type chaîne et donner le résultat dans le même type ? Bilder a des particularités lorsqu'il s'agit de chaînes de caractères...
 
boysn >> :

{...} 3. Quant au fichier def... Bien sûr, c'est peut-être à cause d'elle, mais on ne sait pas vraiment où la mettre. Dans les projets C++ Builder 6 et 2009, il n'y a pas de tels fichiers avec cette extension, c'est-à-dire que lors de la construction de la dll elle-même, il semble n'y avoir aucun endroit où la placer. Dans le même dossier, sous le même nom, dans le dossier \MetaTrader 4\experts\libraries n'est pas le même... l'a essayé... En bref, ce n'est pas clair. J'ai essayé un autre exemple qui utilise une dll système prête à l'emploi {...}.

Ces fonctions sont appelées... La raison d'être de DLLSample n'est pas claire.
Si la raison se trouve dans le Linker, qu'est-ce que cela peut être ? Il semble que le fichier soit autonome.

M...ouais...c'est pas clair. L'exemple dans MT4 est-il sûr qu'il fonctionne ? Quelqu'un l'a-t-il testé pour voir s'il fonctionne ?

Merci à tous de répondre et de réagir.

1) même si le constructeur est ahem... "légèrement" erroné, le fichier def est toujours nécessaire

2) Avez-vous déjà essayé d'installer Visual Studio ?

3) l'exemple fonctionne. mauvais constructeur.

 
jartmailru >> :

1) même si le constructeur est ahem... "légèrement" erroné, le fichier def est toujours nécessaire

2) vous n'avez pas encore essayé Visual Studio

3) l'exemple fonctionne. mauvais constructeur.

j'ai fait des dlls pour mt4 sur bilder, def-file n'était pas utile...

 
boysn >> :

Si Linker est la cause, qu'est-ce qui pourrait être là ? Je semble rendre le fichier autonome.


Pouvez-vous faire une capture d'écran des onglets Compilateur, Linker et Packages des paramètres du projet ?

 
alsu >> :

J'avais l'habitude de faire des dlls pour mt4 sur dibilder, def-file n'était pas utile...

Partagez un exemple avec un collègue :-).

Vous devriez peut-être écrire des gribouillis avant la déclaration de la fonction.

.

Et bilder... J'ai encore une copie de 6 avec 4 service packs dessus.

J'ai arrêté de l'utiliser après une affaire amusante :-).

Lorsque j'ajoute une fonction à un fichier .cpp, j'obtiens toutes sortes de problèmes :-).

Les problèmes consistaient en ce que le constructeur mentait sur les paramètres passés dans la fonction par la pile.

Vous supprimez la fonction - tout rentre dans l'ordre.

Je peux également rappeler les variables globales qui ne sont accessibles que depuis un module,

où ils sont déclarés, et du reste vous voyez des déchets :-).