LoadString



  • Hallo,

    folgender Code produziert in der LoadString Zeile eine System.NullReferenceException mit dem Hinweis "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    An die Funktion übergeben wird:

    String* Library = "irgendwas.dll";
    String* Text = "";
    unsigned int StringID;
    

    Der Text mit der StringID ist in der DLL nachweisbar vorhanden. Guter Rat ist jetzt teuer. 😕 Ich habe schon gedacht er öffnet die Dll nicht. Ich habe sie ins System32 Verzeichnis kopiert. Ich habe den eigentlichen Pfad mit SetDllDirectory gesetzt. Ich habe den Pfad auch schon hart-codiert. Ich habe hLib auch schon als HINSTANCE definiert - hat alles nichts gebracht.

    void Resource::GetString(void)
      {
        HMODULE hLib;
        HANDLE hUpdateRes;
        int Len;
        char* lpText;
        char* lib = (char*)(void*)Marshal::StringToHGlobalAnsi(Library);
    
        hLib = LoadLibrary(lib);
        if (hLib == NULL)
        {
          ErrorHandler();
        }
    
        Len = LoadString(hLib, StringID, lpText, sizeof(lpText)/sizeof(TCHAR)); 
        // ^^^^^^^^^^^ Da passiert es ^^^^^^^^^^^^
        if (Len == 0)
        {
          ErrorHandler();
        }
    


  • JohnDoe schrieb:

    String* Library = "irgendwas.dll";
    String* Text = "";
    

    Das sieht für mich etwas komisch aus - entweder char* oder nur String, oder bringe ich da gerade etwas durcheinander 😕



  • JohnDoe schrieb:

    char* lpText;
    [...]
    Len = LoadString(hLib, StringID, lpText, sizeof(lpText)/sizeof(TCHAR));
    

    Wo reservierst du für lpText Speicher?!
    Außerdem: Warum teilst du durch sizeof(TCHAR), wenn du oben nur char verwendest 😕



  • Hmm,
    mit dem Speicher hast du recht. Aber mit char lpText[255] bleibt sich das Ergebnis gleich (also die Exception). Durch TCHAR teile ich weil Microsoft in der MSDN Library ausdrücklich darauf hinweist. Aber ich wenn ich das weglasse habe ich auch immer noch die Exception.



  • Bist du das ganze mal mit dem Debugger durchgegangen? 🙄



  • Ja, das komische ist - am Anfang hatte ich try/catch außenrum. Aber die Exception wurde nicht abgefangen. Kann es daran liegen, dass das Ganze in einer DLL ist die aus einem C# Programm aufgerufen wird ?



  • Liefert LoadLibrary einen Wert ungleich NULL - also wird ErrorHandler nicht aufgerufen?

    JohnDoe schrieb:

    Kann es daran liegen, dass das Ganze in einer DLL ist die aus einem C# Programm aufgerufen wird ?

    Klappt denn der Zugriff auf andere Funktionen dieser DLL? Außerdem ist die Verwendung von Klassen (nach außen hin) in DLLs nicht ganz unproblematisch ⚠



  • Ich habe jetzt den Code rauskopiert in eine einfache Form-Application. Siehe da es tut. Es liegt also wohl an der DLL, da ich den Code aber mehrmals benötige ist er da eigentlich richtig untergebracht. Wie kann ich die DLL lauffähig machen ?



  • Ok, es läuft jetzt. Nach meinem letzten Posting habe ich mir die Sache noch mal angeschaut. Irgendwann ist mir im Debugger aufgefallen, dass eine Variable die ich gerade gelöscht hatte angezeigt wurde. Dann ist mir ein Licht aufgegangen - wenn man eine DLL testen will, dann bietet VS die Möglichkeit dies mit Hilfe einer Applikation zu tun. Offensichtlich wird beim kompilieren der DLL die Applikation nicht neu kompiliert und dadurch arbeitet man ohne es zu merken einer falschen Version der DLL. Kann sein, dass dies nur deshalb so war, weil meine eigentliche Applikation in C# ist. Vielleicht prüfe ich das morgen.

    Tnx für die Unterstützung.


Anmelden zum Antworten