Überprüfen auf DLL existens in einem Directory



  • Hallo zusammen,

    Ich habe einen C_Wrapper geschrieben für einen Labview Interface.
    Zu diesem Interface sind mehrere abhängige DLL zu gebrauchen.
    Meinen Problem ist folgende:

    1. Wie kann ich der Path, wo die Application lauft (hier in disem Fall wo Labview.exe) dynamisch rausfinden.
      Ich habe es einen Funktion geschrieben, die mir einen 0 gibt falls alle DLL da sind und einen zahl >0 falls eine der DLL fehlt.
      Codeausschnitt:
    int chek_if_dll_exists()
    {
    	int error = 0;
    	//char myPath[_MAX_PATH+1];
        //GetModuleFileNameA(NULL,myPath,_MAX_PATH);
    	// Mit dieses Funktion "GetModuleFileNameA(....)" : bekomme ich zwar der Path aber mit Labview.exe und es muss wieder bearbeitet werden...
    	// und dann wieder der DLL_Name dazu angehängt was nicht unbedingt sehr schlau
    
    	// Ich habe dann was anders versucht:
    	std::ifstream dllfile("....myPath\\DLLName.dll", std::ios::binary); 
    	if(!dllfile)
    	{
    		errror = DLLMissing;
    	}
    
    }
    


  • GetModuleFileName mit dem Modulhandle der Applikation (erhälst du in mit GetModuleHandle und dem Name der Applikation) gibt dir den pfad zum Programm.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Eine kurze Frage :
    wenn ich die DLL in der Art lade:

    HMODULE dllHandle;
    dllHandle = loadLibrary(L"MyDLL.dll");
    if (dllHandle == NULL)
    {
     // DLL not exist
    }
    ...
    

    soll ich auch:

    FreeLibrary(dllHandle);
    

    Was für eine Wirkung hat diese Funktion, wenn ich die vergesse?
    Danke


  • Mod

    Mit LoadLibrary wird die DLL geladen, deren Code im DLLMain ausgeführt und alle mit der DLL verbundenen DLLs auch geladen. Nur zum Testen ob die DLL da ist, ist das wohl Overkill.

    Zum Prüfen ob diese Nutzbar ist OK.

    Wenn Du FreeLibrary vergisst, wird die DLL im Adressraum belassen und DLLMain wird nicht erneut aufgerufen um etwaige Ressourcen freizugeben.



  • Hallo Martin,
    danke für die Antwort.
    Allerdings verstehe ich nicht was meinst du damit,:

    Martin Richter schrieb:

    Nur zum Testen ob die DLL da ist, ist das wohl Overkill.

    ?



  • eigentlich das Laden der DLL wollte ich gar nichts.
    Ich möchte einfach deren existenz prüfen.

    Fragen, die mir durch den Kopf gehen:

    1. was bewirkt, wenn ich der DLL mehrfach lade?
    2. wann muss ich den FreeLibrary einsetzen?

    Danke


  • Mod

    Zum Testen der Existenz: PathFileExists, Access, stat...

    Wird eine DLL mehrfach geladen passiert eigentlich ncits außer, dass ein Zähler hochgezählt wird, oder DllMain für einen neuen Thread ausgeführt wird.

    Für jeden Load bracuht es ein Free. Es gibt einen Referenzzähler.
    Die DLL wird entladen wenn der Referenzzähler auf 0 fällt und diese DLL nicht zuvor implizit geladen wurde.



  • Hallo Martin und danke für deine Antwort.

    Eine Frage habe ich noch.

    Da in meine Anwendung um eine C_Wrapper sich handelt. Also habe ich keine Destruktur in dem ich

    FreeLibrary("MYDLL")
    

    aufrufen kann.
    Soll ich villeicht eine Funktion zu aufraümen schreiben?

    Dieses Wrapper wird in LabVIEW gebraucht und möchte nicht, dass irgendwie auf eine Grund der Labview abstürzt.



  • Warum willst Du eine neue Funktion zum Aufräumen schreiben?
    Mache es einfach so:

    HMODULE dllHandle; 
    dllHandle = loadLibrary(L"MyDLL.dll"); 
    if (dllHandle == NULL) 
    { 
     // DLL not exist 
    }
    else
    {
     // DLL exists
    FreeLibrary(dllHandle);
    }
    

    elegant wäre, wenn es zu einem Fehler kommt auf

    GetLastError() == ERROR_FILE_NOT_FOUND
    

    zu prüfen.



  • Gerhard_gast schrieb:

    eigentlich das Laden der DLL wollte ich gar nichts.
    Ich möchte einfach deren existenz prüfen.

    Ich bin kein Fan von "erst prüfen und dann machen". Ich mache normalerweise "machen und dann gucken ob's geklappt hat". Ist meist einfacher und vor allen "sicherer". Sicherer in dem Sinn, dass es oft schwer ist eine vollständige Prüfung durchzuführen ohne wirklich "zu machen". Und vor allem kann sich zwischen der Prüfung und dem "machen" auch alles ändern - z.B. Files können gelöscht werden etc.

    Wenn man einfach macht, dann hat man nachher entweder erfolgreich und vollständig gemacht, oder eben nicht. Und wenn man beim Programmieren nicht geschludert hat, dann weiss man nachher auch welches von beiden. Und falls was schief gegangen hat meist auch genau was und oft auch warum (Fehlercodes etc.).

    Gerhard_gast schrieb:

    1. wann muss ich den FreeLibrary einsetzen?

    FreeLibrary musst du gar nicht unbedingt aufrufen.
    Kommt auf die Anwendung drauf an, gibt natürlich Fälle wo es nötig ist. I.A. ist es aber nicht nötig, und die DLL nicht zu entladen ist auch wieder die sicherere Variante.
    Die DLL zu früh zu entladen kann nämlich auch wieder zu Problemen führen. z.B. wenn die DLL noch Threads/Timer/asynchrone IOs laufen/ausständig hat. Oder auch wenn noch irgend ein Programmteil auf statische Daten (globale Variablen, Literals, ...) der DLL zugreift nachdem sie entladen wurde.
    (Oder auch auf dynamisch angeforderten Speicher, der aber in der DllMain freigegeben wurden.)

    Davon abgesehen ist die Frage wann du die DLL entladen kannst einfach zu beantworten: "wenn du mit ihr fertig bist". 😉

    ps: Wenn du wirklich prüfen willst ob ein File existiert, dann kannst du dazu schön GetFileAttributes verwenden. Falls es das File nicht gibt kommt INVALID_FILE_ATTRIBUTES zurück, und GetLastError liefert danach einen entsprechenden Fehlercode (vermutlich ERROR_FILE_NOT_FOUND wenn der Pfad gültig ist, man alle nötigen Berechtigungen hätte aber einfach kein File mit dem Namen existiert).



  • Hallo,

    wenn ich die Funktion "FreeLibrary(dllHandle)" wie es hier unten geschrieben:

    HMODULE dllHandle;
    dllHandle = loadLibrary(L"MyDLL.dll");
    if (dllHandle == NULL)
    {
     // DLL not exist
    }
    else
    {
     // DLL exists
    FreeLibrary(dllHandle);
    }
    

    stürze das Labview.
    😡



  • Aha. Soso. Sehr interessant.


  • Mod

    Eine schlecht programmierte Komponente würde ich mal sagen... 😉


Log in to reply