[gelöst] Problem mit Proxy-DLL
-
Er findet vermutlich die mscvr71.dll nicht... leg die mal in das gleiche Verzeichnis wie die DLL.
-
Die liegt in demselben Verzeichnis:
http://img687.imageshack.us/img687/9781/foldert.pngDie war schon bei der SQLPlus Installation dabei.
-
Und wieso lädst Du es dann mit einem absoluten Pfad, wenn eh beide DLLs im gleichen Verzeichnis liegen???
-
Ich hatte vorher einen relativen Pfad, das ging nicht. Also habe ich es danach mit einem absoluten Pfad versucht, was auch nicht ging

Ich habe eben noch einmal mit relativem Pfad probiert, aber es funktioniert leider nicht.
-
Ich habe eben erst gemerkt, das Dependency Walker wohl auch zum Debuggen genutzt werden kann

Jedenfalls habe ich mal einen Trace laufen lassen und folgendes bekommen:
http://img12.imageshack.us/img12/9808/dependserror.pngKann jemand mit den Fehlern was anfangen?
Ich werde das Log auch nochmal posten...
-
Dependency Walker Tracelog:
http://pastebin.ca/1841150
-
Das Problem wird vermutlich sein, dass Du in DllMain, die LoadLibrary Funktion aufrufst!
Das sollte man tunlichst vermeiden! (ist auch irgendwo so dokumentiert).Rufe die "Init" Funktion einfach mal in jeder Funktion auf, dann sollte es gehen...
Oder Du linkst doch gegen all die DLLs, welche die original-DLL auch verwendet!
-
Also ich habe ein globales Objekt, in dem die Funktionspointer geladen werden:
http://www.pastebin.ca/1838934Aber ich habe vorhin noch einen Artikel gefunden, wo stand, das wohl dieses globale Objekt irgendwie auch durch die DllMain()-Methode der Laufzeitbibliothek erstellt... oder so ähnlich, das war ein sehr technischer Artikel

Ok ich werde mal versuchen, in jede der 4000 Methoden folgendes einzubauen:
if (dllObject.hL == NULL) dllObject.hL = LoadLibrary(L"ooci.dll"); if (dllObject.p[xxx] == NULL) dllObject.p[xxx] = GetProcAddress(hL,"funcxxx"); __asm jmp dllObject.p[xxx*4];
-
TheGrudge schrieb:
if (dllObject.hL == NULL) dllObject.hL = LoadLibrary(L"ooci.dll"); if (dllObject.p[xxx] == NULL) dllObject.p[xxx] = GetProcAddress(hL,"funcxxx"); __asm jmp dllObject.p[xxx*4];Ja ich weiß, Schreibfehler
War ja nur ein Beispiel.
Aber leider funktioniert das auch nicht, ich bekomme wieder eine Access Violation, und selbst TOAD, was immer lief, will nun nicht mehr.
-
Hmm es scheint nun zu funktionieren, jedoch sehr instabil. Logging in eine Datei führt schnell zum Absturz (fprintf). Aber immerhin, SQLPlus startet endlich einmal.
-
Warum deklarierst Du die Funktionen nicht ganz normal und rufst diese dann ohne Assembler auf?????
-
Das wird bei 2996 Funktionen recht aufwendig

Ich brauche nur 8 oder 10 Funktionen zu überschreiben, die restlichen 2986 werden einfach durchgeleitet.
Das Codebeispiel ist ja nicht komplett, ich hatte es gekürzt. Da die Signatur der Funktionen ja auch immer variiert, kann man das schlecht generisch erstellen. Mit dem Assembler-Call spare ich mir die Beachtung der Signatur.
Nur bei den 10 interessanten Funktionen muss ich dann die Signatur setzen, den Funktionspointer entsprechend casten und Parameter auswerten.
-
Wollte nur nochmal schnell erwähnen, das ich es mittlerweile hin bekommen habe.
Einige Punkte, warum die DLL abgestürzt ist:- Debug-Build (musste als Release gebaut werden)
- LoadLibrary weder in externer Klasse, noch in DLLMain() aufrufen, sondern in jedem Funktionsbody (also check mit IF ob handle schon initialisiert, sonst LoadLibrary()-Call)
- Calling convention (musste __cdecl sein)
Danke an alle, die versucht haben, mir hierbei weiterzuhelfen. Waren auch sehr nützliche Tipps dabei
