Delphi in C++ umwandeln



  • strummelbunzi schrieb:

    short ist falsch es mus int sein den da steht integer:32 bit^^

    In der Tat, aber nur in der Readme. 😉

    dlltool ist ein program das bei den MinGW binutils bei liegt.

    Welchen Compiler benutzt du?

    Du könntest auch versuchen wie von strummelbunzi vorgeschlagen die Funktionen dynamisch zu laden.

    typedef int (__stdcall * OpenLPTInterfaceFunc)(int);
    OpenLPTInterfaceFunc open_lpt_interface;
    
    //dll laden
    HMODULE m = LoadLibrary("LPT_DMX.DLL");
    
    // Funktion laden
    open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, "OPEN_LPT_INTERFACE");
    //oder
    open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, "_OPEN_LPT_INTERFACE");
    //oder
    open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, (LPCSTR)3);
    //oder
    open_lpt_interface = (OpenLPTInterfaceFunc)GetProcAddress(m, (LPCSTR)(3 << 16))
    

    Musst halt ein wenig ausprobieren.



  • erst mal vielen Dank für die zahlreichen Antworten.

    Aber ich bin da irgendwie zu dämlich für!!
    Alles was ihr bis jetzt geschrieben habt bekomm ich entweder nicht umgesetzt oder es funktioniert nicht.
    Ich hab gelesen das man mit dem wintool von borland aus ner dll ne def ziehen kann, aber das funzt bei mir auch net.

    Mit MinGW komm ich nicht klar.

    Ich frag das zwar nicht gerne, aber kann ich nicht einen von euch die daten schicken, und ihr wandelt mir das so um das ich mit den drei funtionen arbeiten kann? ich hab gestern bis 5 uhr dran gehangen und heute sitz ich auch schon 2 std davor. So langsam sind meine nerven im keller.

    Das wär echt nett von euch.

    Danke

    PS wie schon geschrieben ich hab den borland compiler



  • wi wärs mit dem GNU p2c ??
    der wandelt pascal in C um...

    Mfg SHade37337

    p.s. und den gibts auch für windoof..!!!
    sowas is ja nur fielhandlig dass liesse sich mit C++ STD machen...



  • Das hört sich nicht schlecht an, aber kann es sein das das teil nur für linux gibt??



  • wenn du c++ builder verwendest, dann brauchst du nicht mal den Quelltext zu konvertieren. binde einfach die *.pas -Datei in dein Projekt ein. Der Compiler generiert daraus eine .hpp-Datei die du dann includen kannst.

    Der Integer-Delphi-Typ ist 32bit. Zumindest war er in der Version 5.0. Ich sehe aber keine Vorteile darin warum sich das geändert haben sollte. Außer vielleicht für != 32Bit-Prozessoren.



  • bcbler schrieb:

    wenn du c++ builder verwendest, dann brauchst du nicht mal den Quelltext zu konvertieren. binde einfach die *.pas -Datei in dein Projekt ein. Der Compiler generiert daraus eine .hpp-Datei die du dann includen kannst.

    Wusst' ich auch noch nicht. Interessant. 👍



  • shade37337 schrieb:

    wi wärs mit dem GNU p2c ??
    der wandelt pascal in C++ um...

    Wie der Name schon sagt, verwandelt es Pascal in C um und nicht in C++. Delphi bzw. Object Pascal wird auch gar nicht unterstützt.



  • ich hab jetzt die pas datei eingebunden, wenn ich jetzt starte dann kommt dieser fehler.

    [Linker Fataler Fehler] Fatal: Illegal option: 11\LPT_DMX_LIB;c:\programme\borland\cbuilder6\lib\obj;c:\programme\borland\cbuilder6\lib;c:\programme\borland\cbuilder6\lib\release
    

    was heißt denn das genau?? ich versteh das so das der etwas nicht findet, stimmt das???



  • beim linker include path für die libs:

    11 ist kein gültiges device

    guck halt mal die error messages an und übersetz sie aus dm englischen....



  • ich hab jetzt alles mal geordnet. Wenn ich jetzt starte bekomm ich diese Meldung

    [Linker Fehler] Unresolved external '' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\LPTTEST4\FICHE1.OBJ
    

    Google sagt dazu das von der dll die lib fehlt. ich hab aber keien lib und weiß auch nicht wie man die erstellen kann. weiß da einer was drüber???



  • Wenn du die lib nicht hast, dann musst du dynamisch linken, das heißt du musst mit LoadLibrary die dll öffnen und mit GetProcAdress die Adressen der Funktionen zur Laufzeit ermitteln.

    Wie das geht erfährst du hier.



  • Ich verzweifel hier noch.

    nix geht. gibts hier keinen profi der sich der sache mal annehmen kann?
    es kann doch eigenlich nicht so schwer sein.
    wenn jemand so freundlich ist mir zu helfen der meldet sich bitte mal per ICQ bei mir (329-573-922).

    Bitte helft mir...

    DANKE



  • Stell' doch einfach alles was Du hast auf einen FTP in ein ZIP Archiv.

    Dann kann sich jeder mit Langeweile und Zeit mal dran versuchen, auch Nicht-ICQler, auch wenn Du nicht on bist...



  • Falls eine dll vorhanden ist, eine lib aber fehlt, kann man diese mit implib auch erstellen.
    Vielleicht sollte diese Frage lieber ins BCB-Forum verschoben werden wenn es weiter um den BCB6 geht.



  • Also das mit dem ImpLib hab ich auch schon probiert, aber wintools scheint bei mir ne Macke zu haben. Bringt schon beim Start fehlermeldung (Regitry Root dir error). Ich bekomm damit nichts erstellt.

    Ich hab die Dateien mal auf meinem server gelegt. wär nett wenn sich das mal der eine oder andere angucken kann. villeicht reicht es ja wenn mir einer ne lib daraus zaubert.

    hier der Link:

    www.jbopael.de/LPT_DMX_LIB.rar

    Enthalten in der datei ist das delphi programm, die dll und ein pdf zur erklärung warum es geht.

    Danke



  • #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    typedef void(*GenFuncPtr)(void);
    
    static GenFuncPtr g_FuncPtrArray[3];
    
    BOOL Init(void)
    {
      HMODULE hdll = LoadLibrary("LPT_dmx.dll");
      if(!hdll)
         return FALSE;
    
      g_FuncPtrArray[0] = (GenFuncPtr)GetProcAddress("OPEN_LPT_INTERFACE");
      g_FuncPtrArray[1] = (GenFuncPtr)GetProcAddress("CLOSE_LPT_INTERFACE");
      g_FuncPtrArray[2] = (GenFuncPtr)GetProcAddress("SEND_DMX_COMMAND");
    
      if(!g_FuncPtrArray[0] || !g_FuncPtrArray[1] || !g_FuncPtrArray[2])
      {
         FreeLibrary(hdll);
         return FALSE;
      }
    
      FreeLibrary(hdll);
      return TRUE;
    }
    
    /* Eigentliche Funktionen */
    
    DWORD OPEN_LPT_INTERFACE(DWORD number)
    {
      typedef DWORD(*open_lpt_i)(DWORD);
    
      return ((open_lpt_i)g_FuncPtrArray[0])(number);
    }
    
    void CLOSE_LPT_INTERFACE(void)
    {
      typedef void(*close_lpt_i)(void);
    
      ((close_lpt_i)g_FuncPtrArray[1])(); /* cast wäre nicht nötig */ 
    }
    
    void SEND_DMX_COMMAND(DWORD channel, DWORD data)
    {
      typedef void(*send_dmx_c)(DWORD, DWORD);
    
      ((send_dmx_c)g_FuncPtrArray[2])(channel, data);
    }
    

    Bedingungen:
    -die dll muss im Suchpfad (für DLLs) des Programms liegen
    -Init() muss vor Verwendung von einer der drei Funktionen aufgerufen werden, und der Rückgabewert muss TRUE sein, andernfalls war die Initialisierung nicht korrekt



  • Eine kleine Korrektur:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    typedef void(*GenFuncPtr)(void);
    
    static GenFuncPtr g_FuncPtrArray[3];
    static HMODULE hdll;
    
    BOOL Init(void)
    {
      hdll = LoadLibrary("LPT_dmx.dll");
      if(!hdll)
         return FALSE;
    
      g_FuncPtrArray[0] = (GenFuncPtr)GetProcAddress("OPEN_LPT_INTERFACE");
      g_FuncPtrArray[1] = (GenFuncPtr)GetProcAddress("CLOSE_LPT_INTERFACE");
      g_FuncPtrArray[2] = (GenFuncPtr)GetProcAddress("SEND_DMX_COMMAND");
    
      if(!g_FuncPtrArray[0] || !g_FuncPtrArray[1] || !g_FuncPtrArray[2])
      {
         FreeLibrary(hdll);
         return FALSE;
      }
    
      return TRUE;
    }
    
    void Exit(void)
    {
      FreeLibrary(hdll);
    }
    
    /* Eigentliche Funktionen */
    
    DWORD OPEN_LPT_INTERFACE(DWORD number)
    {
      typedef DWORD(*open_lpt_i)(DWORD);
    
      return ((open_lpt_i)g_FuncPtrArray[0])(number);
    }
    
    void CLOSE_LPT_INTERFACE(void)
    {
      typedef void(*close_lpt_i)(void);
    
      ((close_lpt_i)g_FuncPtrArray[1])(); /* cast wäre nicht nötig */ 
    }
    
    void SEND_DMX_COMMAND(DWORD channel, DWORD data)
    {
      typedef void(*send_dmx_c)(DWORD, DWORD);
    
      ((send_dmx_c)g_FuncPtrArray[2])(channel, data);
    }
    

    Bedingungen:
    -die dll muss im Suchpfad (für DLLs) des Programms liegen
    -Init() muss vor Verwendung von einer der drei Funktionen aufgerufen werden, und der Rückgabewert muss TRUE sein, andernfalls war die Initialisierung nicht korrekt
    -Bei Beendigung muss Exit() aufgerufen werden, damit die dll wieder freigegeben wird



  • beßer die Funktionen nihct anhand Name ladden (du weist ja nicht wiesie in der DLL heisen) sondern mit Ordinary nummer einfach die nummer in string casten und GetProcAddress ubergebben^^ wie schonn vorher gezeigt^^



  • 😃 Endlich mal etwas was keinen compiler fehler raus wirft!!
    aber so ganz scheint das noch nicht zu funktionieren.

    Also bei mir sieht das jetzt so aus:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    #define WIN32_LEAN_AND_MEAN 
    #include <windows.h> 
    
    typedef void(*GenFuncPtr)(void); 
    
    static GenFuncPtr g_FuncPtrArray[3]; 
    static HMODULE hdll;
    
    BOOL Init(void) 
    { 
      hdll = LoadLibrary("LPT_dmx.dll"); 
      if(!hdll) 
         return FALSE; 
    
      g_FuncPtrArray[0] = (GenFuncPtr)GetProcAddress(hdll,"OPEN_LPT_INTERFACE");
      g_FuncPtrArray[1] = (GenFuncPtr)GetProcAddress(hdll,"CLOSE_LPT_INTERFACE");
      g_FuncPtrArray[2] = (GenFuncPtr)GetProcAddress(hdll,"SEND_DMX_COMMAND"); 
    
      if(!g_FuncPtrArray[0] || !g_FuncPtrArray[1] || !g_FuncPtrArray[2]) 
      { 
         FreeLibrary(hdll); 
         return FALSE; 
      } 
    
      return TRUE; 
    } 
    
    void Exit(void) 
    { 
      FreeLibrary(hdll); 
    } 
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Init();
            if(Init()==true)
                    ShowMessage("Alles supi");
    }
    //---------------------------------------------------------------------------
    

    Wenn ich jetzt den button drücke kommt nichts. das heißt ini ist nicht true sondern false. was mach ich denn in dem fall?? heißt das jetzt das er die dll nicht findet oder das die funktionen nicht funktionieren??



  • Der Beitrag davor hat sich erledigt, init() ist true nach starten des programms.

    Die funktionen funktionieren nicht. wenn ich eine funktion aufrufe kommt zugriffsverletzung in adresee 00000.


Anmelden zum Antworten