Hilfe bei der Lösung eines Problems beim Importieren einer Funktion aus einer DLL

 

Ich möchte lernen, wie man Funktionen aus einer DLL importiert. Ich habe verschiedene Varianten ausprobiert, aber die folgende Fehlermeldung wird immer wieder angezeigt: cannot call function from dll (error 127).

1. Ich habe versucht, mein Projekt in C++ Builder 6 zu kompilieren.

2. dasselbe Projekt in C++ Builder 2009.

3. Ich habe ein Projekt aus dem DLLSample-Beispiel in C++ Builder 2009 erstellt und es kompiliert.

Überall das gleiche Ergebnis: Funktion kann nicht von der DLL aufgerufen werden (Fehler 127).

Um es zu testen, verwende ich das Skript mit PExpDll.dll - kompilierte Bibliothek in C++ Builder 2009 aus DLLSample Beispiel, das mit MetaTrader 4 kommt.

Hier ist dieses Skript:

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

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

//+------------------------------------------------------------------+
//| Skriptprogramm-Startfunktion |
//+------------------------------------------------------------------+
int start()
{
//----
Print("Skriptstart");
GetStringValue("Ich frage mich, ob das funktionieren wird?");
GetIntValue(10);

//----
zurück(0);
}
//+------------------------------------------------------------------+

Bitte helfen Sie mir, sagen Sie mir, was ich falsch mache...?

Ich danke Ihnen im Voraus.

 

Option 1) Finden Sie heraus, wo Sie die def-Datei ablegen können. Ohne sie werden Sie wahrscheinlich nicht weiterkommen.

Option 2) Visual Studio installieren

 

LOL

Option 3:

es gibt Tester, zumindest von VB-Excel - prüfen Sie, ob die gewünschte Funktion aufgerufen wird.

Wenn nein - schlechte Linker-Einstellungen, ja - kein Fehler in der MQL-Beschreibung

Bei der Installation von MT4 wird eine gute C-Source-DLL mitgeliefert - verwenden Sie diese zum Üben, das spart eine Menge Zeit.

 
boysn >> :

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

Nach den Regeln der Funktionsdeklaration in MQL-4 haben Sie einen klaren Fehler:

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

Es gibt keinen Namen für den Eingabeparameter, nur den Typ. Dies ist in MQL-4 nicht erlaubt.

 
Urain >> :

Nach den Regeln der Funktionsdeklaration in MQL-4 gibt es einen eklatanten Fehler:

Es gibt keinen Namen für den Eingabeparameter, nur den Typ. In MQL-4 ist dies nicht erlaubt.

Was der Compiler nicht beschwört, können Sie.

Ich habe versucht, es so zu schreiben:

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

Alles funktioniert einwandfrei.

Nach dem C- und C++-Kanon müssen Sie eigentlich gar keine Parameternamen angeben.

Außerdem ist der Programmierer in den meisten Fällen damit beschäftigt, sie zu bearbeiten und zu kommentieren.

 

Vielen Dank für Ihren Rat, danke für Ihre Antwort.

1. In MT4 habe ich Service-Settings-Advisors-Confirm call of dll functions angekreuzt. Wenn ich also das Skript ausführe, fragt es mich, ob ich diese Funktion aufrufen soll...? Ich wähle "Ja" und dann kommt die folgende Fehlermeldung: cannot call function from dll (error 127).

2. Was ist mit Deklarationen von Funktionen ohne Parameter wie double GetDoubleValue(double), so steht es in den Beispielen, zumal der Compiler sich nicht darüber beschwert, also ist es in Ordnung.

3. und was ist mit der Def-Datei... Sicher, vielleicht liegt es an def-file, aber ich weiß wirklich nicht, wo ich es einordnen soll. In C++ Builder 6- und 2009-Projekten gibt es keine solchen Dateien mit einer solchen Erweiterung, d.h. beim Erstellen der dll selbst scheint es nirgends einen Platz dafür zu geben. Im gleichen Ordner unter dem gleichen Namen in \MetaTrader 4\experts\libraries Ordner ist nicht das gleiche... ausprobiert... Kurz gesagt, es ist nicht klar. Ich habe ein weiteres Beispiel ausprobiert, bei dem eine vorgefertigte System-DLL verwendet wird

#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

Diese Funktionen werden aufgerufen. Der Grund für DLLSample ist unklar.
Wenn der Grund im Linker liegt, was kann es dann sein? Ich scheine die Datei als eigenständige Datei zu erstellen.

Äh... ja... ich versteh's nicht. Und das Beispiel in MT4 wird sicher funktionieren? Hat jemand überprüft, ob es funktioniert?

Ich danke Ihnen allen, dass Sie geantwortet haben und antworten.

 
Wie übergibt man ihm String-Parameter und gibt das Ergebnis im selben Typ aus? Bilder hat Eigenheiten im Umgang mit Strings...
 
boysn >> :

{...} 3. Was die Def-Datei betrifft... Natürlich kann es daran liegen, aber es ist wirklich nicht klar, wo man es einordnen kann. In C++ Builder 6 und 2009 Projekten gibt es keine solchen Dateien mit dieser Erweiterung, d.h. beim Erstellen der dll selbst scheint es nirgendwo zu stecken. Im gleichen Ordner unter dem gleichen Namen in \MetaTrader 4\experts\libraries Ordner ist nicht das gleiche... ausprobiert... Kurz gesagt, es ist nicht klar. Ich habe ein anderes Beispiel ausprobiert, das eine vorgefertigte System-DLL {...} verwendet.

Diese Funktionen werden als... Die Ursache von DLLSample ist unklar.
Wenn der Grund im Linker liegt, was könnte es dann sein? Ich scheine die Datei als eigenständige Datei zu erstellen.

M...ja...das ist nicht klar. Ist das Beispiel in MT4 sicher, dass es funktioniert? Hat jemand getestet, ob es funktioniert?

Ich danke Ihnen allen, dass Sie geantwortet haben und antworten.

1) auch wenn der Bauherr ähm... "leicht" falsch, def-Datei wird noch benötigt

2) Haben Sie schon versucht, Visual Studio zu installieren?

3) Beispiel funktioniert. falscher Erbauer.

 
jartmailru >> :

1) trotz der Tatsache, dass der Bauherr ähm... "leicht" falsch, def-Datei wird noch benötigt

2) Sie haben Visual Studio noch nicht ausprobiert

3) Beispiel funktioniert. falscher Erbauer.

ich habe tatsächlich dlls für mt4 auf bilder gemacht, def-file war nicht nützlich...

 
boysn >> :

Wenn Linker die Ursache ist, was könnte es dann sein? Ich scheine die Datei eigenständig zu machen.


können Sie einen Screenshot der Registerkarten Compiler Linker und Pakete der Projekteinstellungen machen?

 
alsu >> :

Ich habe früher dlls für mt4 auf dibilder gemacht, def-file war nicht nützlich...

Teilen Sie ein Beispiel mit einem Kollegen :-).

Vielleicht müssen Sie vor der Deklaration der Funktion etwas Schnörkel schreiben.

.

Und bilder... Ich habe noch eine Kopie von 6 mit 4 Service Packs darauf.

Nach einem lustigen Fall habe ich es nicht mehr benutzt :-).

Wenn ich eine Funktion zu einer .cpp-Datei hinzufüge, erhalte ich alle Arten von Störungen :-).

Die Pannen bestanden darin, dass der Builder bei den Parametern, die über den Stack an die Funktion übergeben wurden, log.

Sie löschen die Funktion - alles ist wieder in Ordnung.

Ich kann mich auch an globale Variablen erinnern, die nur von einem Modul aus zugänglich sind,

wo sie deklariert sind, und vom Rest sieht man Müll :-).