Dll-Problem
-
Hallo, ich möcht dll-funktionen nicht so aufrufen:
hInstance = ::LoadLibrary("dplib.dll"); pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "DPS_open (\"DPSONLINE\",&user_handle,DPS_SM_SIMPLE, (DPR_BYTE)StationAddr, 7, 0x8054,0,&init_data,NULL, baudrate, &error)");
sondern wie normale c++-funktionen. etwo so:
if (DllFunction(blabla))
ich wollte fragen ob das irgendwie möglich ist oder ob ich sowiso das GetProcAdress-zeugs brauche... Danke!
-
Du brauchst das GetProcAdress sowieso, denn damit ermittelst du die Funktionsadresse. Irgendwie dünkt mich der Aufruf sowieso etwas merkwürdig. das Zweite Argument ist lediglich der funktionsname, nicht der komplette Aufruf... Der code wie du ihn da präsentierst funktioniert wirklich?
Was du machen kannst ist, deine persönliche LoadModule und UnloadModule-funktion, mit der du alle benötigten Funktionszeiger lädst und wieder entlädst... Innerhalb des Quelltextes kannst du die Funktionen dann ganz normal mit
pDllFunction("blah");
aufrufen.
-junix
-
Man kann eine Dll doch auch statisch linken, dann entfällt der Aufwand von GetProcAdress.
Die Funktionen werden dann wie ganz normale Funktionen behandelt. Nachteilig ist, das man es nicht mitbekommt, wenn die Dll nicht da ist, wo sie sein soll.
Ein LoadLibrary gibt einen Fehler zurück, wenn es etwas nicht laden kann, bei einer statisch gelinkten Dll wird die Anwendung kommentarlos einfach nicht loslaufen.
-
SilentSurfer schrieb:
Nachteilig ist, das man es nicht mitbekommt, wenn die Dll nicht da ist, wo sie sein soll.
Ein LoadLibrary gibt einen Fehler zurück, wenn es etwas nicht laden kann, bei einer statisch gelinkten Dll wird die Anwendung kommentarlos einfach nicht loslaufen.
... nicht ganz richtig. Eigentlich sollte vom gelinkten LibraryLoader (den der Linker einfach einsetzt) eine Fehlermeldung ala "Komponenten nicht gefunden" oder so ähnlich auftauchen.
-junix
-
Man kann eine Dll doch auch statisch linken, dann entfällt der Aufwand von GetProcAdress.
Die Funktionen werden dann wie ganz normale Funktionen behandelt. Nachteilig ist, das man es nicht mitbekommt, wenn die Dll nicht da ist, wo sie sein soll.
Wie kann ich denn die dll statisch linken?
[edit] quoting richtig "getagt"[/edit]
-
Header und dll unter "Projekt->Dem Projekt Hinzufügen" selbiges machen (o:
-junix
-
roN schrieb:
Wie kann ich denn die dll statisch linken?
Dazu brauchst du eine LIB-Datei. Wenn du die DLL selber geproggt hast mit dem BCB, wird dir automatisch eine LIB-Datei mitgeneriert. Wenn nicht, verwende in den Examples im BCB-Ordner das Programm WinTools und darin wiederum IMPLIB, um eine LIB aus ner DLL zu erstellen. Diese LIB fügst du dann zu deinem Projekt dazu. Dann musst du in deinem Projekt noch die Prototypen der Funktionen der DLL angeben, die du benutzen willst. Schau mal dazu in der FAQ im Keyboard-Hook-Beispiel ("Tasten systemweit abfangen") nach. Da werden im Hauptprojekt auch Funktionen einer statisch gelinkten DLL genutzt.
-
okay, ic hab jetzt eine lib erstellt und mein header sieht so aus:
extern DPR_DWORD DPS_open ( DPR_STRING *cp_name, // in DPR_DWORD *user_handle, // out DPR_DWORD slave_mode, // in DPR_WORD station_addr, // in DPR_WORD addr_change, // in, not used! DPR_WORD pno_ident_nr, // in DPR_WORD user_wd, // in, not used! DPS_INIT_DATA_T *init_data // in DPS_MAX_DATA_T *max_data_len // in, not used! DPR_WORD baud_rate // in DP_ERROR_T *error); // out
aber beim kompilieren bleibt der compiler in der obersten zeile des headers stehen und meint: "Fehler in der Deklarationssyntax"...
-
in der BCB Hilfe gibts auch Thema "Packages und DLLs erstellen". Das wäre dir ganz bestimm gut tun.
-
in der BCB Hilfe gibts auch Thema "Packages und DLLs erstellen". Das wäre dir ganz bestimm gut tun.
Das Problem ist, ich hab' die Dll bereits und muss sie "nur" einbinden...