Einzelnen Beitrag anzeigen

Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...

  Alt 15. Aug 2023, 16:48
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
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat