![]() |
Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...
Hallo,
ich habe ein Delphi 7 Projekt, das eine mit dem BCB 6 erstellte DLL lädt. Dann werden die Funktions-Pointer via win32api Funktion "GetProcAddress" geholt. in den C Code habe ich folgendes:
Code:
Im Delphi/Pascal Code habe ich folgendens:
typedef void (*func_ShowParserErrorText)(char* message);
typedef void (*func_WriteTextToConsole )(char* message); extern func_ShowParserErrorText ShowParserErrorText ; extern func_WriteTextToConsole WriteTextToConsole ; extern void EXPORT import_func_ShowParserErrorText ( void(*)(char*) ); extern void EXPORT import_func_WriteTextToConsole ( void(*)(char*) );
Code:
Dann in der DLL (im C-Code):
procedure Start;
var export_ShowParserErrorText: procedure( m: Pchar) cdecl; export_WriteTextToConsole : procedure( m: Pchar) cdecl; Handle : THandle; procedure WriteTextToConsole( m: Pchar ); var S1: String; begin S1 := 'O ' + String(m) + ' O'; ShowMessage( '-----> ' + S1 ); end; begin Handle := LoadLibrary(PChar(ExtractFilePath(Application.ExeName) + '\foo.dll')); try if Handle = 0 then raise Exception.Create('dll not loaded.'); export_ShowParserErrorText := GetProcAddress(Handle,'_import_func_ShowParserErrorText'); export_WriteTextToConsole := GetProcAddress(Handle,'_import_func_WriteTextToConsole'); export_ShowParserErrorText(@ShowParserErrorText); // hook: yyerror export_WriteTextToConsole (@WriteTextToConsole); // ab hier, rufe ich die Funktion "RunParser" (in der DLL) auf finally FreeLibrary(Handle); Handle := 0; end; end;
Code:
In der RunParser Funktion sollte nun der String "buffer" innerhalb des Pascal-Codes
void RunParser(void)
{ WriteTextToConsole( strdup( "buffer" ) ); } angezeigt werden. Macht er aber nicht. Was kann da passiert sein ? Also: - in Delphi DLL Laden - von Delphi aus Funktionzeiger der Delphi Funktion dem BCB 6 bekannt machen - im BCB 6 dann die bekannt gemachte Adresse anspringe, und ausführen Für sachdienliche Hinweise bin ich dankbar. paule32 |
AW: Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...
Versuchs mal mit
Delphi-Quellcode:
oder
export_ShowParserErrorText(PChar(ShowParserErrorText));
export_WriteTextToConsole (PChar(WriteTextToConsole));
Delphi-Quellcode:
Sollte funktionieren wenn ShowParserErrorText und WriteTextToConsole variablen vom Typ String sind. Ansonsten sag uns, wie diese beiden Variablen oder Konstanten deklariert sind.
export_ShowParserErrorText(@ShowParserErrorText[1]);
export_WriteTextToConsole (@WriteTextToConsole[1]); |
AW: Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...
Hallo,
die beiden Beispiele gehen leider nicht.
Code:
// das sind die Funktionen, deren Adresse per GetProcAddress
// zugeordnet werden var export_ShowParserErrorText: procedure( m: Pchar) cdecl; export_WriteTextToConsole : procedure( m: Pchar) cdecl; // dies ist die Prozedur, die in der DLL aufgerufen werden soll procedure WriteTextToConsole(m: PChar); begin ShowMessage(PChar(m)); end;
Code:
WriteTextToControls wird in Delphi aufgerufen, aber der buffer ('report') wird nicht angezeigt.
// und das ist der C-Code in der DLL:
char * buffer = (char*) malloc(1024); strcpy( buffer, "report"); ShowMessage( buffer ); // <-- wird angezeigt WriteTextToConsole( buffer ); // wird nicht angezeigt Es kommt auch keine Fehlermeldung. |
AW: Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...
So, Problem scheint gelöst ...
ich habe den Code mal umgeändert - so in "Voodoo-Programming-Style":
Code:
Zum erstaunen.
char * buffer = (char*) malloc( strlen( result.c_str()));
buffer = strdup( result.c_str() ); WriteTextToConsole( buffer ); Denn nun funktioniert der Code den ich vorher hatte auch. Irgendwie müssen die ShowMessage Funktionen den Heap ändern bzw. den String, nach der Anzeige im Fenster einen cut geben. Anders kann ich mich das nicht erklären. Gruß, paule32 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz