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:
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*) );
Im Delphi/Pascal Code habe ich folgendens:
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;
Dann in der
DLL (im C-Code):
Code:
void RunParser(void)
{
WriteTextToConsole( strdup( "buffer" ) );
}
In der RunParser Funktion sollte nun der String "buffer" innerhalb des Pascal-Codes
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