DLL-Handles übergeben?
-
Hallo,
ich bin gerade am basteln eines Programms, bei dem zum Start mehrere DLL's geladen werden.
Ein zweites Problem habe ich auch noch, und zwar handelt es sich bei den DLLs im init-bereich um welche, die nicht ich erstellt habe und nur zu manchen den Quellcode habe. Wenn ich sie nun laden möchte, funktioniert das nur mit denen, die ich selbst nochmal compiled habe. Die wo mir der Quellcode fehlt, werden sofort wieder entladen, da keine Symbole geladen wurden...
Wie kann ich das umgehen? ich kenne ja die Funktionsrümpfe in diesen DLL allerdings wohl windows nicht......erledigt...
Im Verlauf des Programms kann später ein spezieller 'Betriebsmodus' ebenfalls als dll hinzu geladen werden, welcher die DLLs vom Start benutzen soll, ohne sie neu laden zu müssen.
Hierfür übergebe ich der Funktion in der DLL das Handle der Startdll. Allerdings kann ich dann in der 'Betriebsmodus-dll' nicht auf die anderen Zugreifen (die Pointer auf die ursprünglichen dlls sind dann alle NULL)...Wie kann ich also einer DLL die Funktionen einer früher geladenen DLL zugänglich machen, ohne nochmal LoadLibrary aufrufen zu müssen?*
Grüße und hoffe jemand kann mir helfen

Christoph
-
Du hast nicht ganz verstanden, wie das alles funktioniert mit dem Laden von DLLs. Hierzu solltest du nochmal in der MSDN nachlesen! Du machst es dir auch viel zu kompliziert. Fülle einfach eine Struktur mit Funktionspointern und übergib die als Parameter an deine Betriebsmodus DLL Fuktion.
-
genau so hab ich es ja gemacht, nur nach der übergabe, ist sie nur noch mit NULL gefüllt...
header:
struct dllh { HINSTANCE g_loaded_typ; HINSTANCE g_camera; HINSTANCE g_window; /* ... */ }; static struct dllh dll_handles;hauptprogramm:
void initBereich() { dll_handles.g_window = AfxLoadLibrary(_T("dlls\\dllname")); } /* ... */ void hauptprogramm() { dll_handles.g_loaded_typ = AfxLoadLibrary(string); //hier wird Betriebsmodus-DLL geladen myFunc = (funcPtrVoidPtrToInt)GetProcAddress(dll_handles.g_loaded_typ, "funcName"); myFunc(&dll_handles); }In der letzten Zeile springt er in die DLL, wie erwartet, allerdings steht in der übergebenen Struktur dll_handles nur noch der Eintrag für g_loaded_typ. Der Rest, der auf die DLLs zeigen sollte ist NULL (z.b. g_window)...
-
Wird initBereich denn überhaupt vor hauptprogramm aufgerufen?
-
übergiib doch einfach funktionspointer zu den funktionen die du brauchst, was willste schon mit hinstance in deiner dll? ist doch umständlich.
-
ok, problem 1 hat sich erledigt: da das hauptprogramm in einem eigenen CDialog ist, mußte ich dem Objekt extra noch die struct übergeben... ich dachte er nimmt automatsch den aus dem header, aber war wohl nicht so...
das zweite problem besteht aber noch immer: wieso entlädt mir windows dlls sofort wieder, wenn ich sie nicht selbst compiled habe?
bzw. kann ich irgendwie 'von außen' ohne quellcode die zu exportierenden symbole einer dll definieren?wenn ich mir die binary-dll im VS.Net anschau, sehe ich auch, daß gar kein Manifest vorhanden ist... kanns daran liegen? und wenn ja, wie bekomme ich das nachträglich dazu? oder wie kann man sowas umgehen?
-
rofler schrieb:
übergiib doch einfach funktionspointer zu den funktionen die du brauchst, was willste schon mit hinstance in deiner dll? ist doch umständlich.
das mache ich, weils ca. 6 dlls mit je 10 funktionen sind. da soll sich der betriebsmodus selbst die funtionen raus ziehen, dies braucht. drum kriegt der modus die ganze dll hingeworfen

-
was meinste mit entladen? windows entlädt nix...was für symbole die dll exportiert kannst du doch im dependency walker sehen...wie gesagt lies mal hier http://msdn2.microsoft.com/en-us/library/ms682589(VS.85).aspx
-
im debugger sieht das ganze so aus:
"programm.exe": "C:\Documents and Settings\...\fertig_debug\dlls\meineDLL.dll" geladen, Symbole wurden geladen. "programm.exe": "C:\Documents and Settings\...\fertig_debug\dlls\fremdeDLL.dll" geladen, Keine Symbole geladen. "programm.exe": "C:\Documents and Settings\...\fertig_debug\dlls\fremdeDLL.dll" entladen.Zeile 1 kommt nachdem eine von mir compilte dll mit AfxLoadLibrary geladen wurde
Zeile 2 und 3 kommt beim laden einer fremden dllwie in zeile 3 schon steht, wurde die dll wieder entladen und der aufruf liefert null zurück, wodurch ich die funktionen darin nicht nutzen kann...
bei eigenen dlls funktionierts ohne probleme...