Announcement

Collapse
No announcement yet.

C++ DLL in Delphi benutzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C++ DLL in Delphi benutzen

    Hallo,

    ich habe ein Problem. Ich muss in meinem D6 Programm Funktionen aus einer DLL benutzen, die in C++ geschrieben wurde. Ich habe auch die Header Datei, habe schon mit dem HeadConv probiert die zu konvertieren aber es klappt nicht.
    Ich weiß, hier sind kluge Leute, bitte hilf mir. Unten die Header Datei.

    ////////////////////////////////////////////

    #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 Port = 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

    ////////////////////////////////////////////

    schöne Grüße an alle

    Christoph Fröhlich

  • #2
    Evtl. einfach von Hand konvertieren?<p>
    Hier gibt es ein kleines Tutorial:<br>
    http://www.delphi-jedi.org/APICONVTEAMS:589239#reflinks
    JEDI Conversion Tutorial<p>
    Ansonsten mal unter http://www.delphi-jedi.org/APILIBRARY:589239 Win32API.zip runterladen. Dort sind viele fertig konvertierte Header drin und die Original sind ja im SDK drin. Da sollte das Abschreiben gut möglich sein...<p>
    Viel Erfolg, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Eigentlich sieht es harmlos aus, aber es sind ein paar Gemeinheiten drin, die alles verderben koennen.<br>
      Wenn string ein C++ Objekt ist, dann ist alles verloren, da die DLL dann C++ spezifisch ist

      Comment


      • #4
        Hallo Mario,

        es ist leicht zu sagen: manuell per Hand übersetzen. Ich sitze schon seit einer Woche bei dem Problem, habe alles mögliche gelesen und es funktioniert einfach nicht.
        Ich kann die Funktionen wie z.B.: Disconnect1(false), oder Connected1() aufrufen. Wenn aber die Übergabe-Parameter kommen wie bei Connect1(...) dann ist es Schluss. Es kommt Fehler: Zugrifsverletzung ....

        schöne Grüße
        Christop

        Comment


        • #5
          Hallo Robert,

          GENAU ! Gemeinheiten. Ich habe alles versucht. Die Funktionen ohne Parameter, oder mit Bool kann ich aufrufen. Die mit Parameter melden Zugriffsverletzung.

          Ich habe die Funktionen so übersetzt,
          z.B.:

          function Connect1(stIPADRESS:string; nPORT: integer):boolean; stdcall; // es funktioniert nicht

          function Connected1():boolean; stdcall;

          function Disconnect1(bWert: boolean):boolean; stdcall;

          function Request1(var stItemName:string; eIAtt:Te_ItemAttributes; var stValue:string):boolean; stdcall; // es funktioniert nicht

          function UnAdviseAll1():boolean; stdcall;

          function Poke1(var stItemName:string; var stValue:string; eIAtt:Te_ItemAttributes):boolean; stdcall; // es funktioniert nicht

          Ach so:

          type
          Te_ItemAttributes = (
          IAtt_None = 0,
          IAtt_Value,
          IAtt_ServiceMode)

          Liegt es wirklich an mich ? Bin ich so blöd ?
          Oder hat Robert Recht, String -> C++ spezifisch
          ?

          Grüße an alle

          Christop

          Comment


          • #6
            string in C++ und string in Delphi sind nicht kompatibel.<br>
            Ist string in C++ eine Klasse? Wenn ja, dann sind die Funktionen definitiv nicht mit Delphi kompatibel

            Comment


            • #7
              Hallo Christoph,<p>
              ja, dass Du schon so lange dran abeitest, war aus dem Posting nicht zu erkennen. Gibt es denn evtl. C++ Demo-Source, aus dem der Aufruf hervorgeht? Dann könnte Robert vermutlich schnell sagen, obs geht oder nicht... Und wenn er sagt, dass es nicht geht, kannst Du drauf vertrauen <p>
              Dann könntest Du, falls Du kleine C++ Programm schreiben kannst, nur noch versuchen, eine Zwischenschicht in C++ zu erzeugen.<p>
              Schöne Grüße, Mario Noac
              Schöne Grüße, Mario

              Comment


              • #8
                Hallo,

                danke für die Analyse.
                Robert hat Recht. C++ String ist nicht kompatibel mit String in Delphi. Der Author von DLL hat alles auf char* geändert.
                Jtzt muss ich wahrscheinlich nur PCHAR benutzen.

                noch mal vielen Dank

                Christop

                Comment

                Working...
                X