Loadlibrary Fehler 126 - Funktioniert mit exe, aber nicht mit xll



  • Hallo zusammen,
    ich habe ein kleines Beispiel-exe File, das Funktionen aus einer dll ausruft. exe und dll liegen dabei im selben Ordner. Nun muss die dll erstmal geladen werden.

    Header SharedLibCaller.h

    #include <windows.h>
    	#include <direct.h>
    	HINSTANCE libHandle;
    	#define LOADLIB(X) LoadLibraryA(X)
    	#define LOADSYMBOL GetProcAddress
    

    CPP

    #include "SharedLibCaller.h"
    #include <string.h>
    #include <cstdlib>
    
    int main(int argc, char *argv[]) {
    	int ret = 0;
    	libHandle = LOADLIB("meineDLL.dll");  // <-------------- DLL laden klappt!
    	if (!libHandle) {
    		cout << "Could not load library " << nameOfLibToLoad << ", error code = " << LASTERROR() << endl;
    		system("PAUSE");
    		return 1;
    	}
    
    	// macht irgendwas...
    }
    

    Soweit funktioniert alles einwandfrei!

    Nun möchte ich aber eine xll Datei erstellen, die wiederum jene dll aufruft. Die Headerdateien sind genau die selben, nur statt in der main Funktion wird LOADLIB nun in einer "normalen" Funktion aufgerufen.

    double // squares number using the dll
    squareInCpp(double &arg)
    {
    	libHandle = LOADLIB(nameOfLibToLoad.c_str());  <----- FEHLER 126
    	if (!libHandle) {
    		double err = GetLastError();
    		return err;
    	}
    
            // mache was....
    	CLOSELIB(libHandle);
    	return res;
    
    }
    

    xll und dll Dateien liegen im selben Ordner. Mit der xll tritt nun der Fehler 126 bei LoadLibraryA auf, obwohl der Code fast gleich ist 😕
    DependencyWalker meckert bei der xll, dass die MSVCR90D.DLL fehlen würde.

    Habt ihr eine Idee woran das Problem liegt?

    Viele Grüße
    Tönnies

    * Ich baue eine xll, weil die dll schon fertig ist und in Excel verfügbar gemacht werden soll. Ich rufe in der xll dann fertige Funktionen aus der dll auf.
    * Excel 2002, Visual Studio 2008 Express Edition





  • Tönnies schrieb:

    Habt ihr eine Idee woran das Problem liegt?

    Das Problem ist, dass ein Verzeichnis wo eine DLL geladen wurde nicht im Suchpfad für weitere DLLs liegt.
    Bei der .exe mit der der Prozess erzeugt wurde ist das anders, in dem Verzeichnis wo die liegt wird immer nachgesehen.


  • Mod

    SetDLlDirectory kann hier Abhilfe schaffen.



  • Hallo, danke für eure Antworten, dadurch ist mir das Problem ein wenig klarer geworden.

    Ich habe versucht mit SetDLLDirectory zu arbeiten, aber ich bekomme immer noch den Fehler 126 😕 Hab mich an der akzeptierten Antwort hier orientiert http://stackoverflow.com/questions/4385806/determine-the-loaded-path-for-dlls
    So sieht meine Funktion jetzt aus

    double squareInCpp(double &arg)
    {
    	SetDllDirectory(NULL); // Reset.
    	SetDllDirectory(""); // Plug "binary planting" security hole. `
    	SetDllDirectory("C:\\Programme\\XLW\\xlw-5.0.0f0\\xlw\\examples\\MyExample\\vc9\\Debug");
    
    	libHandle = LOADLIB("C:\\Programme\\XLW\\xlw-5.0.0f0\\xlw\\examples\\MyExample\\vc9\\Debug\\MeineDLL.dll");
    	if (!libHandle) {
    		double err = GetLastError(); // <--------- FEHLER 126
    		return err;
    	}
    
    	// mach was...
    
    	CLOSELIB(libHandle);
    	SetDllDirectory(NULL); // Reset.
    	SetDllDirectory(""); // Plug "binary planting" security hole. `
    
             ...
    }
    

    Wenn ich außerdem GetModuleFileName benutze, um den Pfad der xll Datei zu bekommen, liefert er mir stattdessen immer den Pfad der EXCEL.exe zurück 😞



  • DependencyWalker, ProcessMonitor, ...



  • DependencyWalker liefert wie vorher, dass MSVCR90D.DLL nicht gefunden wird. Bin gerade noch am googlen, so richtig schlau werde ich gerade nicht daraus...
    Werde mal ProcessMonitor installieren...

    SetDLLDirectory funktioniert - kann ich dann davon ausgehen, dass LoadLibrary auch die meine dll findet, aber den Fehler 126 liefert, weil diese DLL wiederum fehlende Referenzen hat?



  • Hmm ich komm leider nicht weiter, habe die MSVCR90D.DLL jetzt mit in den Ordner der xll und dll getan.
    Nun meckert der DependencyWalker nicht mehr, er warnt nur "Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module." bei den Dateien MPR.DLL und SHLWAPI.DLL
    Wenn ich das richtig in den DependencyWalker FAQs verstehe, ist diese Meldung nicht so wichtig.

    Trotzdem schafft es meine xll nicht, die dll zu laden 😞



  • ProcessMonitor listet mir meine xll Datei auf, aber nicht die zu ladende dll. Hmm, also kann die offensitchlich meine dll nicht geladen, es liegt also schon mal nicht an irgendwelchen Abhängigkeiten meiner DLL... 😕



  • Falls es jmd interessiert: Hat sich erledigt, wenn ich die Release Version der dll benutze klappt alles einwandfrei (also so wie im Ursprungs Post dargestellt).
    Hab vorher immer mit der debug version gearbeitet.



  • Hast du etwa auf einem System getestet wo kein Visual Studio installiert ist?
    Dann ist klar dass es nicht geht, weil dann einfach die Debug Varianten der Visual Studio Runtime DLLs fehlen.



  • Hallo hustbaer, doch auf dem System ist Visual Studio installiert.



  • Auch komisch, dann sollte die Debug DLL eigentlich genau so funktionieren...



  • Ja das hat mich leider auch viel Zeit gekostet, weiß leider auch nicht wieso, aber bin froh dass es jetzt geht. Wie gesagt, die Debug Version der DLL hatte auch keine Abhängigkeitsprobleme laut DependencyWalker...

    Danke für Eure Hilfe!


Log in to reply