Probleme beim Laden eines Strings aus DLL



  • Hallo,

    Ich will ein Programm mit mehreren Sprachen ausstatten, dazu will ich die einzelnen Strings für jede Sprache in eine DLL packen und zur Laufzeit laden.

    Der Code im Programm:

    HINSTANCE langDLL = LoadLibrary ("LangDE.dll");
    Form1 -> Caption.LoadStr (langDLL, IDS_STRING1);
    FreeLibrary (langDLL);
    

    Das bewirkt leider gar nichts. In der DLL sollen nur die Strings stehen, dazu habe ich die LangDE.rc mit der STRINGTABLE erstellt und über den Projektmanager zum DLL-Projekt hinzugefügt, entsprechende lang.h habe ich in die DLL und das Programm eingebunden. Muß ich in der DLL noch irgendetwas machen?

    Ich weiß das es dazu schon ein paar Threads hier gibt, hat mich aber nicht weitergebracht.

    Danke, Steffen Mueller



  • Hallo,

    Was genau stimmt denn nicht? Gibt es eine Fehlermeldung oder kommt einfach nur ein Leerstring?
    Kontrolliere bitte auch immer ob langDLL gültig ist.

    HINSTANCE langDLL = LoadLibrary ("LangDE.dll");
    if( langDLL != NULL )
    {
        AnsiString cap = LoadStr ((int)langDLL, IDS_STRING1); // edit: ist falsch
        Form1->Caption = cap;
        FreeLibrary (langDLL);
    } else
    {
    // Fehlerbehandlung weil dll nicht gefunden.
    }
    

    Geh diesen Code mal mit dem Debugger durch und kontrolliere deine Variablen. Vielleicht bekommst du ja einen Hinweis drauf was nicht geht.

    [edit]Kommando zurück. LoadStr kann so ja garnicht verwendet werden. Nur für direkt eingebundene Ressourcen. Ich schau nochmal gründlicher nach[edit]

    Ciao



  • Ok, neuer Code. Ich denke hier wirst du API-Funktionen bemühen müssen.

    const int MAXBUF = 1024;
    HINSTANCE langDLL = LoadLibrary ("LangDE.dll");
    if( langDLL != NULL )
    {
        char* buffer = new char[MAXBUF+1];   
        int size = LoadString((int)langDLL, IDS_STRING1, buffer, MAXBUF);
        if( size > 0 )
        {
           buffer[MAXBUF] = '\0';
           Form1->Caption = buffer;
        } else // Ressource nicht gefunden
        FreeLibrary (langDLL);
        delete[] buffer;
    } else
    {
    // Fehlerbehandlung weil dll nicht gefunden.
    }
    


  • Danke, funktioniert. Das mit AnsiString::LoadString hatte irgendwo im Zusammenhang mit dem Laden von Strings aus DLLs gelesen (weiß nicht mehr wo), scheint aber so nicht zu funktionieren. Nun gut, dann eben direkt mit der API.

    (Die Überprüfung ob die DLL geladen werden konnte hatte ich beim rumprobieren wieder rausgenommen, gehört aber selbstverständlich mit dazu.)

    Edit:

    Funktioniert doch mit AnsiString::LoadString, in meinem Code oben war ein Fehler:

    AnsiString __fastcall TFormMain::GetLangString (int id) {
        if (langDLL != NULL) {
            AnsiString temp;
            return temp.LoadString (langDLL, id);
        }
        else return "";
    }
    

    Danke, Steffen Mueller


Anmelden zum Antworten