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

 

Ich habe sozusagen etwas in eine h-Datei geschrieben


extern __declspec( dllexport) int __stdcall GetIntValue(int);

dann in der cpp einfach


int __stdcall GetIntValue(int)
 
Vielleicht hilft das Schlüsselwort extern.
 
alsu >> :

...


...und ich ziehe es vor, mich überhaupt nicht mit Schnüren zu befassen... Warum braucht man sie überhaupt in einer Dll??? ist es nur für die Schönheit?

Und Borland selbst empfiehlt die Verwendung von char* oder char[] im Metatrader-Stil, falls erforderlich.

 

Ich glaube, die korrekte Art und Weise, dies im Builder zu deklarieren, ist wie folgt (ich erinnere mich nicht genau)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

Ich denke, es ist richtig, im Builder etwas wie dieses zu deklarieren (ich erinnere mich nicht genau)

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

genau dort!

 

Herzlichen Dank für die Tipps! Es funktionierte mit diesem Beispiel nach extern "C" int __declspec(dllexport) __stdcall GetIntValue().

Ich habe es mit Double- und String-Funktionen versucht, und es hat auch funktioniert. Ich habe beschlossen, das Wissen, das ich bei Ihnen erworben habe, auf eine praktische Aufgabe anzuwenden. Aber leider... Das ist mir leider nicht gelungen.

Wenn Sie können, helfen Sie mir bitte noch einmal.

Im Bilder-Projekt gibt es Dateien zur DLL-Erstellung: UHsvd.h, Usvd.cpp und andere.

Die Datei UHsvd.h enthält eine Funktion, die später exportiert werden soll:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt);

Die Datei Usvd.cpp enthält die gleiche Funktion, die dann exportiert werden sollte:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneeded,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt)

{

........

}

Ich beginne eine DLL in Bilder in dieser Variante zu erstellen, alles "baut", alles funktioniert, keine Fehler.

Wenn ich Änderungen in UHsvd.h, Usvd.cpp vornehme, wie

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a,

.....), dann erscheinen Fehler von 2 bis 19 mit verschiedenen Varianten, d.h. ich habe diese Deklaration entweder in der Header-Datei oder in cpp gemacht... obwohl es meines Wissens nach in der Header-Datei stehen sollte (dann gibt es nur 2 Fehler):

[BCC32 Error] Usvd.cpp(128): E2356 Type mismatch in redeclaration of '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'
[BCC32 Error] UHsvd.h(111): E2344 Frühere Deklaration von '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,int,ap::real_1d_array &,ap::real_2d_array &,ap::real_2d_array &)'

So wie ich es verstehe, gibt es eine Diskrepanz... Aber ich verstehe es nicht ganz... :-(

Ich hoffe wirklich auf Ihre Hilfe und Unterstützung...

 

boysn писал(а) >> {...}

Wenn Sie können, helfen Sie bitte ein weiteres Mal.

Es gibt Dateien im Bilder-Projekt, um eine DLL zu erstellen: UHsvd.h, Usvd.cpp und andere.

Die Datei UHsvd.h enthält eine Funktion, die dann exportiert werden muss:

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int unbenutzt,
int vtneeded,
int zusätzlicherSpeicher,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}

Wenn ich richtig verstanden habe, ist ap::real_1d_array eine Klasse. Und ap::real_1d_array & ist ein Verweis auf ein Klassenobjekt.

Aber mein Lieber, Sie können nur double myData[] als Parameter an die Dll übergeben,

die in Funktionen wie double * aussehen werden.

 
jartmailru писал(а) >>

Wenn ich es richtig verstehe, ist ap::real_1d_array eine Klasse. Und ap::real_1d_array & ist ein Verweis auf ein Klassenobjekt.

Aber mein Lieber, nur double myData[] kann als Parameter an die Dll übergeben werden,

was in Funktionen wie double * aussieht.

Ich stimme mit Ihnen völlig überein. Ich werde sie in MQL beim Importieren als doppelt deklarieren. Aber im Moment habe ich Probleme, die DLL selbst in C++ Builder 2009 zu erstellen. Ich erhalte Fehler, wenn ich sie konstruiere. Wenn ich die Erklärung nicht verwende

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) dann verläuft die Bibliothekskompilierung in Bilder erfolgreich und ohne Probleme. Nun weiß ich nicht, wie ich die Deklaration der Exportfunktionen im Bilder-Projekt korrekt erstellen kann :-(, um

Arbeits-DLL mit der Möglichkeit, die Funktion rmatrixsvd zu exportieren.

 
boysn >> :

Ich stimme mit Ihnen völlig überein. Ich werde sie in MQL beim Importieren als doppelt deklarieren. Aber im Moment habe ich Probleme, die DLL selbst in C++ Builder 2009 zu erstellen. Ich erhalte Fehler, wenn ich sie konstruiere. Wenn ich die Erklärung nicht verwende

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ...., ....) dann kompiliert die Bibliothek in Bilder erfolgreich, ohne Probleme. Nun weiß ich nicht, wie ich die Deklaration der Exportfunktionen im Bilder-Projekt korrekt erstellen kann :-(, um die

Arbeits-DLL mit der Möglichkeit, die Funktion rmatrixsvd zu exportieren.

Brrr. Sie scheinen mir seltsamerweise zuzustimmen.

.

Eigentlich geht es darum, "Adapter" oder "Brücke" zu schreiben.

"Adapter" unter dem Gesichtspunkt, dass die Parameter der exportierten Funktion

muss mit den Parametern, die vom Metatrader übergeben werden können, abgeglichen werden,

. d.h. Sie benötigen eine zusätzliche Funktion, die den Aufruf an die gewünschte Stelle weiterleitet.

Und "Brücke" unter dem Gesichtspunkt, dass sie für die Funktion nicht notwendig ist

die Sie erklären, dass sie die Arbeit selbst erledigen werden.

Und umgekehrt - es ist nicht notwendig, die Funktion aufzurufen, die die Arbeit erledigt.

.

Das heißt, Sie müssen die Schnittstelle und die Implementierung trennen, d.h. die Implementierung kann auf Klassen aufgebaut werden

. und Funktionen, die außerhalb der Dll liegen und von denen niemand je erfahren wird.

.

Aber lassen Sie uns ein Beispiel betrachten.

.

Sie sollten die Funktion wie folgt deklarieren:

extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// Natürlich werden Sie hier auch die Anzahl der Zeilen und Spalten angeben.

{

//Eingabeparameter in ap::real_2d_array umwandeln

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ;

.

//berechnen

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3);

.

//Übersetzen des Ergebnisses von a3 in out

convertReal2DArrayToPDouble(a3, out);

.

Rückkehr;
}

.

Hier - natürlich - die Funktion rmatrixsvd

nicht als extern "C" oder __stdcall oder __declspec usw. deklariert ist.

Denn es ist Teil der internen, versteckten Implementierung.

 

Entschuldigung, ich habe es leider nicht ganz verstanden...

Von http://alglib.sources.ru/ habe ich die C++-Implementierung (Code) heruntergeladen, die ich benötige. Wenn Sie nichts dagegen haben, sehen Sie sich bitte das beigefügte 100 KB große Archiv an. Dieser Algorithmus hat viele Hilfsfunktionen, die Gesamtzahl der Codezeilen liegt bei etwa 3000 Zeilen... Ich denke schon.

So steht es auf der Website, d.h. es ist zu viel, und es ist ziemlich schwierig, es in MQL zu übersetzen... Man muss den Algorithmus selbst verstehen, um ihn richtig übersetzen zu können. Im Moment ist es für mich ein bisschen kompliziert. Deshalb möchte ich C++ Builder 2009 verwenden, um eine DLL mit diesem vorgefertigten Code zu erstellen und die Funktion rmatrixsvd(...) aufrufen, die ich von der DLL benötige. Das ist der Punkt, an dem ich nicht weiterkomme... wo und wie man es richtig deklariert... Mit diesem Code, ohne eine Zeile zu ändern, wird die DLL erstellt, ohne Fehler. Aber sobald ich extern "C" bool __declspec(dllexport) __stdcall einfüge, erhalte ich Fehler...

Ich danke Ihnen für Ihre Zeit.

Dateien:
svdy1e.cpp.zip  94 kb
Grund der Beschwerde: