Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Callback in C++ DLL (mal wieder) (https://www.delphipraxis.net/168686-delphi-callback-c-dll-mal-wieder.html)

Nord-Vision 4. Jun 2012 13:47


Delphi Callback in C++ DLL (mal wieder)
 
Hallo allerseits,

ich habe ein kleines Problem mit der Einbindung einer Navi-Lösung in ein Delphi Projekt. Die Schnittstelle ist eine C++ DLL mit entsprechenden Header Files. Ich bin zumidestens soweit, dass ich die Navi-Anwendung über die DLL - Funktion starten kann. Das Problem ist, dass zur Kommunikation mit meiner Anwendung eine Callback-Funktion verwendet wird. Und genau das funzt leider nicht. Sowie etwas an die Callback Funktion von der Navi-Anwednung aus geschickt wird, gibt's ne Schutzverletzung. Hier mal die Definitionen aus dem Header File und meine Umsetzung. (Das Ganze soll später in eine Komponente verpackt werden, deshalb schon das objekt TSygicMap)

typedef void (_stdcall *APPLICATION_HANDLEPROC)(int nEvent, void* pData);


=> der Aufruf im C++ Beispiel

INT CApplicationAPI::InitApi( LPCTSTR lpszPath, APPLICATION_HANDLEPROC pfnApplicationEventHandler, int nLeft, int nTop, int nWidth, int nHeight, BOOL bRunInForeground /*= TRUE*/ )
{
if ( !LoadAPI(_T("ApplicationAPI.dll")))
return -1;

if ( _ghInitApi != NULL )
{
return _ghInitApi( lpszPath, pfnApplicationEventHandler, nLeft, nTop, nWidth, nHeight, bRunInForeground );
}
return -1;
}

und hier die Delphi Umsetzung:

Delphi-Quellcode:
Type
     APPLICATION_HANDLEPROC = Procedure (nEvent: Integer; pData: Pointer); stdcall;


     _cyg_InitAPI = Function (lpszPath: PAnsiChar; pfnApplicationEventHandler: APPLICATION_HANDLEPROC;
                              nLeft, nTop, nWidth, nHeight: Integer; bRunInForeground: wordbool = True): Integer; stdcall;
 
...


Procedure Handler (var nEvent: Integer; pData: Pointer); Stdcall;
Begin
   ShowMessage('Hallo');
End;

function TSygicMap.InitAPI(strPath:STring) : Integer ;
begin
  result:= _proc_InitAPI(@PansiChar(StrPath),@handler,FLeft,FTop,FWidth,FHeight,FRunInForeground);
end;

Ich hoffe, Ihr könnt helfen.

Gruß Andy

daywalker9 4. Jun 2012 13:50

AW: Delphi Callback in C++ DLL (mal wieder)
 
Bitte editiere deinen Eintrag und nutzte die DELPHI - Tags, damit man den Code besser lesen kann

DeddyH 4. Jun 2012 13:57

AW: Delphi Callback in C++ DLL (mal wieder)
 
Geht es so?
Delphi-Quellcode:
function TSygicMap.InitAPI(strPath:STring) : Integer ;
begin
  Result:= _proc_InitAPI(PansiChar(StrPath),@handler,FLeft,F Top,FWidth,FHeight,FRunInForeground);
end;

Nord-Vision 4. Jun 2012 14:16

AW: Delphi Callback in C++ DLL (mal wieder)
 
so besser ?? ;-D

DeddyH 4. Jun 2012 14:38

AW: Delphi Callback in C++ DLL (mal wieder)
 
Hast Du es denn jetzt einmal ohne das @ versucht?

Nord-Vision 4. Jun 2012 15:00

AW: Delphi Callback in C++ DLL (mal wieder)
 
... jepp.

Ich habe die Variable pfnApplicationEventHandler auch schon mal als VAR deklariert. Immer mit dem gleichen Effekt - GPF sowie die Callback angesprochen wird. :twisted:

NickelM 4. Jun 2012 17:24

AW: Delphi Callback in C++ DLL (mal wieder)
 
Hm also in deinem geposteten Code hab ich gleich 2 Fehler gefunden:

Delphi-Quellcode:
Type
     APPLICATION_HANDLEPROC = Procedure (nEvent: Integer; pData: Pointer); stdcall;


     _cyg_InitAPI = Function (lpszPath: PAnsiChar; pfnApplicationEventHandler: APPLICATION_HANDLEPROC;
                              nLeft, nTop, nWidth, nHeight: Integer; bRunInForeground: wordbool = True): Integer; stdcall;
 
...

                    //warum var? haste oben auch nicht
Procedure Handler ({var }nEvent: Integer; pData: Pointer); Stdcall;
Begin
   ShowMessage('Hallo');
End;

function TSygicMap.InitAPI(strPath:STring) : Integer ;
begin                    //Warum einen pointer auf PAnsiChar? LPCTSTR ist PAnsiChar mehr nicht
  result:= _proc_InitAPI({@}PansiChar(StrPath),@handler,FLeft,FTop,FWidth,FHeight,FRunInForeground);
end;
Versuchs mal so. und @handler ist richtig.

himitsu 4. Jun 2012 18:12

AW: Delphi Callback in C++ DLL (mal wieder)
 
Dennoch kann das @ bei dem Methodenzeiger weg.

In Delphi wird es standardmäßig ohne @ angegeben.
Außerdem ist Delphi hier so intelligent, daß es weiß, daß man hier den Zeiger übergeben will.

Aber das @ beim PAnsiChar ist garantiert falsch.
Und PAnsiChar + String ist auch nicht sonderlich gut, denn spätestens ab Delphi 2009 wird es damit Probleme geben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 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