AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi 7 EXE und BCB 6 DLL - callback's funktioniert nicht so recht ...
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von paule32.jk · begonnen am 15. Aug 2023 · letzter Beitrag vom 15. Aug 2023
Antwort Antwort
Benutzerbild von paule32.jk
paule32.jk

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

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

  Alt 15. Aug 2023, 15: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
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 15. Aug 2023, 16:05
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.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

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

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

  Alt 15. Aug 2023, 17:11
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.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

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

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

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz