![]() |
C++ DLL in Delphi benutzen
Hallo,
ich habe ein Problem. Ich muss in meinem D6 Programm Funktionen von einer DLL nutzen, die in C++ geschrieben wurde. Ich habe noch eine .h Header Datei dazu aber ich kann die nicht konvertieren. Ich habe schon HeadConv ausprobiert aber der ist leider noch nicht perfect. Kann mir jemand helfen ? Es ist wirklich dringend :( Header und DLL kann ich zuschicken. schöne Grüße an alle Christoph Fröhlich |
Re: C++ DLL in Delphi benutzen
Sage doch lieber, wo genau die Probleme in der Konvertierung stecken. Das Dir jemand den gesamten Header nur so aus Spaß konvertiert ist eher unwahrscheinlich :roll:
...:cat:... |
Re: C++ DLL in Delphi benutzen
Hi,
Der Header sieht so aus: ////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "tcpcli.h" #ifdef TCPIPCLIENTDLL_EXPORTS #define TCPIPCLIENT_API _declspec( dllexport ) #else #define TCPIPCLIENT_API _declspec( dllimport ) #endif #ifdef __cplusplus extern "C" { #endif TCPIPCLIENT_API void __stdcall Initialize1( void (*ReplyOrEvent)(int Rep, const string& stName, const string& stVal, void* pOwner), void* pOwner ); TCPIPCLIENT_API bool __stdcall Connect1( string stIPAddress = HOST, int nPort = PORTNUMBER); TCPIPCLIENT_API bool __stdcall Connected1( ); TCPIPCLIENT_API void __stdcall Disconnect1( bool bWithUnAdvise = false ); TCPIPCLIENT_API bool __stdcall Request1( string& stItemName, e_ItemAttributes eIAtt = IAtt_None, string& stValue = stDummy ); TCPIPCLIENT_API bool __stdcall Poke1( string& stItemName, string& stValue, e_ItemAttributes eIAtt = IAtt_None ); TCPIPCLIENT_API bool __stdcall AdviseStart1( const string& stItemName, e_ItemAttributes eIAtt = IAtt_None, string& stValue = stDummy ); TCPIPCLIENT_API bool __stdcall AdviseStop1( const string& stItemName, e_ItemAttributes eIAtt = IAtt_None ); TCPIPCLIENT_API void __stdcall UnAdviseAll1( ); typedef void (__stdcall* INITIALIZE1)( void (*ReplyOrEvent)(int Rep, const string& stName, const string& stVal, void* pOwner), void* pOwner ); typedef bool (__stdcall* CONNECT1)( string stIPAddress, int nPort ); typedef bool (__stdcall* CONNECTED1)( ); typedef void (__stdcall* DISCONNECT1)( bool bWithUnAdvise ); typedef bool (__stdcall* REQUEST1)( string& stItemName, e_ItemAttributes eIAtt, string& stValue ); typedef bool (__stdcall* POKE1)( string& stItemName, string& stValue, e_ItemAttributes eIAtt ); typedef bool (__stdcall* ADVISESTART1)( const string& stItemName, e_ItemAttributes eIAtt, string& stValue ); typedef bool (__stdcall* ADVISESTOP1)( const string& stItemName, e_ItemAttributes eIAtt ); typedef void (__stdcall* UNADVISEALL1)( ); #ifdef __cplusplus } #endif ///////////////////////////////////////////////////////////////////////////////////////////////////// Und das ist von HeadConv konvertierte PAS Datei: ///////////////////////////////////////////////////////////////////////////////////////////////////// {$INCLUDE "tcpcli.h"} {$IFDEF TCPIPCLIENTDLL_EXPORTS} const TCPIPCLIENT_API = _declspec( dllexport ); {$ELSE} const TCPIPCLIENT_API = _declspec( dllimport ); {$ENDIF} {$IFDEF __cplusplus} {$ENDIF} var Initialize1: function(Rep: VOID (*REPLYOREVENT)(INT; const stName: STRING&; const stVal: STRING&; pOwner): Pointer; pOwner: Pointer) cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var Connect1: function(HOST: STRING STIPADDRESS =; PORTNUMBER: INT NPORT =): TCPIPCLIENT_API BOOL cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var Connected1: function: TCPIPCLIENT_API BOOL cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var Disconnect1: function(false: BOOL BWITHUNADVISE =) cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var Request1: function(var stItemName: STRING; IAtt_None: E_ITEMATTRIBUTES EIATT =; var stDummy: STRING STVALUE =): TCPIPCLIENT_API BOOL cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var Poke1: function(var stItemName: STRING; var stValue: STRING; IAtt_None: E_ITEMATTRIBUTES EIATT =): TCPIPCLIENT_API BOOL cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var AdviseStart1: function(const stItemName: STRING&; IAtt_None: E_ITEMATTRIBUTES EIATT =; var stDummy: STRING STVALUE =): TCPIPCLIENT_API BOOL cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var AdviseStop1: function(const stItemName: STRING&; IAtt_None: E_ITEMATTRIBUTES EIATT =): TCPIPCLIENT_API BOOL cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var UnAdviseAll1: function cdecl {$IFDEF WIN32} stdcall {$ENDIF}; type = VOID (__STDCALL* INITIALIZE1)( VOID (*REPLYOREVENT)(INT REP, CONST STRING& STNAME, CONST STRING& STVAL, VOID* POWNER), VOID* POWNER ); type = BOOL (__STDCALL* CONNECT1)( STRING STIPADDRESS, INT NPORT ); type = BOOL (__STDCALL* CONNECTED1)( ); type = VOID (__STDCALL* DISCONNECT1)( BOOL BWITHUNADVISE ); type = BOOL (__STDCALL* REQUEST1)( STRING& STITEMNAME, E_ITEMATTRIBUTES EIATT, STRING& STVALUE ); type = BOOL (__STDCALL* POKE1)( STRING& STITEMNAME, STRING& STVALUE, E_ITEMATTRIBUTES EIATT ); type = BOOL (__STDCALL* ADVISESTART1)( CONST STRING& STITEMNAME, E_ITEMATTRIBUTES EIATT, STRING& STVALUE ); type = BOOL (__STDCALL* ADVISESTOP1)( CONST STRING& STITEMNAME, E_ITEMATTRIBUTES EIATT ); type = VOID (__STDCALL* UNADVISEALL1)( ); {$IFDEF __cplusplus} {$ENDIF} var DLLLoaded: Boolean { is DLL (dynamically) loaded already? } {$IFDEF WIN32} = False; {$ENDIF} implementation var SaveExit: pointer; DLLHandle: THandle; {$IFNDEF MSDOS} ErrorMode: Integer; {$ENDIF} procedure NewExit; far; begin ExitProc := SaveExit; FreeLibrary(DLLHandle) end {NewExit}; procedure LoadDLL; begin if DLLLoaded then Exit; {$IFNDEF MSDOS} ErrorMode := SetErrorMode($8000{SEM_NoOpenFileErrorBox}); {$ENDIF} DLLHandle := LoadLibrary('TCPIPCLIENT_DLL.DLL'); if DLLHandle >= 32 then begin DLLLoaded := True; SaveExit := ExitProc; ExitProc := @NewExit; @Initialize1 := GetProcAddress(DLLHandle,'Initialize1'); {$IFDEF WIN32} Assert(@Initialize1 <> nil); {$ENDIF} @Connect1 := GetProcAddress(DLLHandle,'Connect1'); {$IFDEF WIN32} Assert(@Connect1 <> nil); {$ENDIF} @Connected1 := GetProcAddress(DLLHandle,'Connected1'); {$IFDEF WIN32} Assert(@Connected1 <> nil); {$ENDIF} @Disconnect1 := GetProcAddress(DLLHandle,'Disconnect1'); {$IFDEF WIN32} Assert(@Disconnect1 <> nil); {$ENDIF} @Request1 := GetProcAddress(DLLHandle,'Request1'); {$IFDEF WIN32} Assert(@Request1 <> nil); {$ENDIF} @Poke1 := GetProcAddress(DLLHandle,'Poke1'); {$IFDEF WIN32} Assert(@Poke1 <> nil); {$ENDIF} @AdviseStart1 := GetProcAddress(DLLHandle,'AdviseStart1'); {$IFDEF WIN32} Assert(@AdviseStart1 <> nil); {$ENDIF} @AdviseStop1 := GetProcAddress(DLLHandle,'AdviseStop1'); {$IFDEF WIN32} Assert(@AdviseStop1 <> nil); {$ENDIF} @UnAdviseAll1 := GetProcAddress(DLLHandle,'UnAdviseAll1'); {$IFDEF WIN32} Assert(@UnAdviseAll1 <> nil); {$ENDIF} end else begin DLLLoaded := False; { Error: TCPIPCLIENT_DLL.DLL could not be loaded !! } end; {$IFNDEF MSDOS} SetErrorMode(ErrorMode) {$ENDIF} end {LoadDLL}; begin LoadDLL; end. /////////////////////////////////////////////////////////////////////////////////////////////////// Und z.B. was soll ich mit {$INCLUDE "tcpcli.h"} machen ? Muss ich noch die tcpcli.h einbinden oder konvertieren ? Deklaration von Initialize1 Initialize1: function(Rep: VOID (*REPLYOREVENT)(INT; const stName: STRING&; const stVal: STRING&; pOwner): Pointer; pOwner: Pointer) cdecl {$IFDEF WIN32} stdcall {$ENDIF}; ist irgendwie falsch. Compiler meldet den Fehler. Ich kriege das nicht hin. Aber ich kann auch bezahlen wenn jemand das nicht aus Spass machen würde :) schöne Grüße Christoph Fröhlich |
Re: C++ DLL in Delphi benutzen
Hi,
"tcpcli.h" ist ebenfalls eine Header-Datei. Leider bin ich hier momentan nicht auf dem laufenden ob es hierzu eine Delphi-dcu gibt. Im Zweifel ansehen. Wenn es ein Standard c-Header ist, dann erst mal weglassen. Leider ist Dein Code etwas unübersichtlich. Nutze in Zukunft den Button für die Delphi-Formatierung. [delphi] Deklaration von Initialize1 Initialize1: function(Rep: VOID (*REPLYOREVENT)(INT; const stName: STRING&; const stVal: STRING&; pOwner): Pointer; pOwner: Pointer) cdecl {$IFDEF WIN32} stdcall {$ENDIF}; [delphi] Hier ist Rep ein Zeiger auf eine Procedure. Deklarier sie vor und gebe als Typ den Procedurezeiger an. Nun hab ich leider nicht D6 und weis nicht, ob Typen wie String& erkannt werden. Ich würde hier auf jeden Fall die Typen bereinigen. Ich hoffe, dass hilft schon weiter, Gruß oki P.S. bei mir brauchst du für die Hilfe nicht bezahlen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 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