2016-04-20 11 views
-1

: Ich bin in delphiwie Zeichenfolge von c passieren ++ delphi

Ich habe Funktion in delphi exportiert folgende:

typedef bool(*MYFUNC) (char *, char*); 

:

function MyFunction(var FirstParam: PChar; var Second: PChar): Boolean; export; stdcall; 

und C++ Anrufer Funktion wie folgt ist aber ich bin immer folgende Ausnahme:

Unhandled exception at 0x76C1F117 (user32.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0x66646664. 

Was sollte der Grund sein ?, antworten Sie mir sehr.

vielen dank.

+0

* Wo * erhalten Sie die Ausnahme? * Wie * benutzen Sie die Delphi-Funktion? Und wann und wo nennst du es? Mit welchen Argumenten? Können Sie bitte versuchen, ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen und uns zu zeigen? Führen Sie Ihr Programm auch in einem Debugger aus, um den Absturz in Aktion zu erfassen, und suchen Sie es in * Ihrer * Quelle. Bearbeiten Sie Ihre Frage so, dass sie MCVE enthält und darauf hinweist, wo der Absturz stattfindet und welche Werte alle beteiligten Variablen haben. –

+0

Welchen Code können Sie ändern? Die Delphi oder die C++ Deklaration? –

+0

m_hModule = LoadLibrary (L "MyDLL.DLL"); \t m_lpTest = (MYFUNC) GetProcAddress (m_hModule, "MyFunction"); – Ramkrushna

Antwort

0
function MyFunction(var FirstParam: PChar; var Second: PChar): Boolean; export; stdcall; 

gibt die Zeiger Argumente durch Verweis (wegen der var)

typedef bool(*MYFUNC) (char *, char*); 

übergibt sie nach Wert. Sie müssen die Signaturen übereinstimmen lassen.

Sie müssen auch die Aufrufkonventionen übereinstimmen - die Delphi-Funktion ist explizit mit stdcall markiert, die C++ - Funktion ist wahrscheinlich cdecl standardmäßig.

Update: Wenn ich Ihren Kommentar richtig verstehe, müssen Sie den C++ - Code an die Delphi-Seite anpassen. Dies könnte wie folgt aussehen:

typedef bool __stdcall(*MYFUNC) (char*&, char*&); 
+0

Ich lade Delphi DLL explizit m_hModule = LoadLibrary (L "MyDLL.DLL"); \t m_lpTest = (MYFUNC) GetProcAddress (m_hModule, "MyFunction"); – Ramkrushna

+0

@Uli müssen Sie auch für Unicode/MBCS-Problem verhärten. Da in C++ er 'char' anstelle von' TCHAR' Makro oder 'WCHAR' verwendet, sollte der entsprechende Delphi Code auch streng definierte' PAnsiChar' verwenden. Nicht zweideutig 'PChar' –

+1

Beachten Sie, dass' PChar' in Delphi 2007 und früher übersetzt 'char *', aber in Delphi 2009 und später wird es stattdessen in 'wchar_t *' übersetzt.Sie müssen also nicht nur die Aufrufkonvention und die Referenzsemantik, sondern auch den richtigen Datentyp abgleichen. –