Delphi in C++ umwandeln
-
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.
-
strummelbunzi schrieb:
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^^
Boa Junge - du solltest schleunigst alle Deutsch Kurse dieses Landes belegen.
-
ich biete mir solche euserungen zu verkneiffen!
^^
an JBOpael
warum ruffst du Init() 2x auf?^^ das koente der uhrsprung des fellers sein
-
Habe extra mitm dependency walker geschaut, die namen stehen so in der dll
-
dann stiemt es also mit den namen^^
-
strummelbunzi schrieb:
ich biete mir solche euserungen zu verkneiffen!
^^
an JBOpael
warum ruffst du Init() 2x auf?^^ das koente der uhrsprung des fellers seinscheiss 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.