Delphi in C++ umwandeln



  • strummelbunzi schrieb:

    ich biete mir solche euserungen zu verkneiffen! 😡 ^^

    an JBOpael
    warum ruffst du Init() 2x auf?^^ das koente der uhrsprung des fellers sein

    scheiss legastheniker 👎



  • mit dem init 2 mal aufrufen hab ich wiederufen. init ist jetzt true nach starten des programms.

    naja, nur wenn ich jetzt sowas eingebe:

    #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);
    } 
    
    // 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);
    }
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    OPEN_LPT_INTERFACE(1);
    }
    

    kommt halt die fehlermedldung "Zugriffsverletzung bei Adresse 000000 [...]"

    Das selbe spiel bei den anderen funktionen.



  • Da fehlt der Code der Init() aufruft, dass du hier 0 als Adresse hast, liegt daran, dass die Zeiger im Array mit 0 initialisiert werden (wenn Init eine der Funktionen nicht laden kann wird FALSE zurückgegeben).



  • Und was heißt das im klartext?



  • Auch auf die Gefahr hin mich hier lächerlich zu machen:

    • Init() aufrufen und Rückgabewert prüfen, am Besten, wenn Du die Anwendung startest, ich kenne Borland nicht, aber da gibt es bestimmt ein TForm1:OnLoad oder so.
    • Funktionen verwenden. Da Init() aufgerufen und der Rückgabewert geprüft wurde kann hier davon ausgegangen werden, dass die Funktionszeiger nun gültig sind.
    • Exit() aufrufen, am Besten, wenn die Anwendung beendet wird, keine Ahnung, wie das bei Borland heißt, evtl. TForm1:OnExit oder so ähnlich.


  • das heist im klartext das du Init nicht aufruffst!!^^

    an omfg
    junge was hast du fuer ein problem damit wen ich den leute versuche zu helfen stadt wie du andre zu beschimpfen!! 😡 ^^



  • Ein tippfehler und keiner weiss mehr wovon ich rede!! 😃

    Mit der init hab ich kein problem! die ist so wie sie sein soll! das mit dem aufrufen der init war falsch! weiß ich!! ich hab den wert von init überprüft und der stimmt auch. (ist beim starten true)

    aber die funtionen machen nicht das was sie sollen.



  • JBOpael schrieb:

    aber die funtionen machen nicht das was sie sollen.

    Sondern?!?

    Könnte die Aufrufkonvention sein. (sollte aber nur bei der Funk. mit 2 Parametern eine Rolle spielen)



  • Sgt. Nukem schrieb:

    Sondern?!?

    Bringt ne fehlermeldung!!



  • Junge jetzt stell dich nicht so an, du wirst das doch wohl noch hinbekommen!



  • Wenn es so wäre wär ich glücklich! ich hab schon alles probiert sämtliche beiträge in google durchgelsen alles was ich an buchmaterial hier hab durchgewälzt und ausprobiert, ausprobiert und nochmal ausprobiert. es will einfach nicht.

    das letzte script was ich gepostet habe ist das einzige was keinen compiler fehler gervorruft, aber bei aufruf der funktion alles zusammenbricht. Wenn es so einfach wäre könnte sich ja einer mal 10 min hinsetzten sich die daten runter laden, in ein scipt einbinden, testen und dann posten. Ich bin da echt zu dämlich für. Wenn mir das nicht so wichtig wäre würde ich mich ja gar nicht so lange hier aufhalten. aber ich brauch den kram.



  • Versuch mal

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    typedef void(__stdcall *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);
    }
    
    // Eigentliche Funktionen
    
    DWORD OPEN_LPT_INTERFACE(DWORD number)
    {
      typedef DWORD(__stdcall *open_lpt_i)(DWORD);
    
      return ((open_lpt_i)g_FuncPtrArray[0])(number);
    }
    
    void CLOSE_LPT_INTERFACE(void)
    {
      typedef void(__stdcall *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(__stdcall *send_dmx_c)(DWORD, DWORD);
    
      ((send_dmx_c)g_FuncPtrArray[2])(channel, data);
    }
    


  • Versuch mal

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    typedef void(__stdcall *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);
    }
    
    // Eigentliche Funktionen
    
    DWORD OPEN_LPT_INTERFACE(DWORD number)
    {
      typedef DWORD(__stdcall *open_lpt_i)(DWORD);
    
      return ((open_lpt_i)g_FuncPtrArray[0])(number);
    }
    
    void CLOSE_LPT_INTERFACE(void)
    {
      typedef void(__stdcall *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(__stdcall *send_dmx_c)(DWORD, DWORD);
    
      ((send_dmx_c)g_FuncPtrArray[2])(channel, data);
    }
    


  • Das hatten wir doch schonmal, oder nicht?

    Das funktioniert nicht, fehler:

    zugriffsverletzung bei adresse 000000000. Lesen von Adresse 000000000.
    


  • Genannter Code funktioniert bei mir problemlos.
    Hier der Code mit dem ich getestet habe. Keine Meldung, gar nichts. Ausgedruckt wird ein Smilie.

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    
    typedef void(__stdcall *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);
    }
    
    // Eigentliche Funktionen
    
    DWORD OPEN_LPT_INTERFACE(DWORD number)
    {
      typedef DWORD(__stdcall *open_lpt_i)(DWORD);
    
      return ((open_lpt_i)g_FuncPtrArray[0])(number);
    }
    
    void CLOSE_LPT_INTERFACE(void)
    {
      typedef void(__stdcall *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(__stdcall *send_dmx_c)(DWORD, DWORD);
    
      ((send_dmx_c)g_FuncPtrArray[2])(channel, data);
    }
    
    int main() {
    	if (Init()) {
    		OPEN_LPT_INTERFACE(1);
    		SEND_DMX_COMMAND(1, 1);
    		CLOSE_LPT_INTERFACE();
    		return 0;
    	}
    	Exit();
    	return 1;
    }
    


  • 😃 😃

    Ich bin dir zu 1000 Dank verpflichtet!!!!

    Es Funktioniert!!!!

    Endlich!!!

    Danke das ihr euch soviel mühe dabei gegeben habt!!



  • JBOpael schrieb:

    Sgt. Nukem schrieb:

    Sondern?!?

    Bringt ne fehlermeldung!!

    Oh Mann... Kein Wunder daß Dir keiner helfen konnte, wenn man Dir jede Fehlermeldung einzeln aus der Nase ziehen muß!!

    HEY MAIN PC GEHT NNICHT MEHR AN, KANN MIR EINER HELFEN?! WO LIEGT DASD PROBLEM!!? DAANKE!!!111eins



  • Ich glaube ja immernoch, dass du durch den ganzen Borland-VCL-Kram die Übersicht verloren hast und einfach Init() nicht richtig aufgerufen hast.



  • JBOpael schrieb:

    Es Funktioniert!!!!

    Dann frage ich mich, was Du dann hier

    JBOpael schrieb:

    Das hatten wir doch schonmal, oder nicht?

    Das funktioniert nicht, fehler:

    zugriffsverletzung bei adresse 000000000. Lesen von Adresse 000000000.
    

    gemacht hast, ich habe den gleichen Code genommen, nichts abgeändert, nur die main() hinzugefügt.

    Naja, egal, wenn es jetzt läuft ist ja gut. :p



  • MirWirdsZuBlöd schrieb:

    Ich glaube ja immernoch, dass du durch den ganzen Borland-VCL-Kram die Übersicht verloren hast und einfach Init() nicht richtig aufgerufen hast.

    Das kann sein. Ich hab wohl vor lauter Bäumen den Wald nicht mehr gesehen.

    Nochmals Danke an alle die ihren Teil dazu beigetragen haben!!


Anmelden zum Antworten