Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ... (https://www.delphipraxis.net/213546-delphi-7-exe-und-bcb-6-dll-callbacks-funktioniert-nicht-so-recht.html)

paule32.jk 15. Aug 2023 15:48

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:
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

peterbelow 15. Aug 2023 16:05

AW: Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...
 
Versuchs mal mit

Delphi-Quellcode:
 export_ShowParserErrorText(PChar(ShowParserErrorText));
 export_WriteTextToConsole (PChar(WriteTextToConsole));
oder
Delphi-Quellcode:
 export_ShowParserErrorText(@ShowParserErrorText[1]);
 export_WriteTextToConsole (@WriteTextToConsole[1]);
Sollte funktionieren wenn ShowParserErrorText und WriteTextToConsole variablen vom Typ String sind. Ansonsten sag uns, wie diese beiden Variablen oder Konstanten deklariert sind.

paule32.jk 15. Aug 2023 17:11

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:
// 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
WriteTextToControls wird in Delphi aufgerufen, aber der buffer ('report') wird nicht angezeigt.
Es kommt auch keine Fehlermeldung.

paule32.jk 15. Aug 2023 17:58

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:
char * buffer = (char*) malloc( strlen( result.c_str()));
buffer = strdup( result.c_str() );
WriteTextToConsole( buffer );
Zum erstaunen.
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