LoadString liefert leere Strings?



  • Hallo Freunde!

    Ich habe eine Stringtable angelegt und diese mit Strings gefüllt.
    Nun möchte diese Strings über die String-ID mit LoadString oder
    direkt über AfxMessageBox (verwendet auch LoadString) auslesen
    und anzeigen.
    LoadString liefert jedoch immer einen leeren String zurück.
    In anderen DLLs und Programmen hat es bisher immer geklappt.
    Hat jemand eine Idee, woran es liegen könnte?

    Einschränkender Hinweis: Wenn ich statt dem Namen einer String-ID,
    die dahinter verborgene Zahl benutze, bekomme ich ebenfalls leere
    Strings zurück.

    Schon mal Danke, Lothar.



  • Du hast wohl einen Programmierfehler gemacht.



  • Poste mal ein bisschen Code.



  • Hallo Freunde!

    Hab jetzt die Ursache, für den oben beschriebenen Fehler der Methode LoadString der Klasse CString herausgefunden.
    Verwendet man diese Methode in einer DLL welche mit Unicode kompiliert wird, so kommt es zu dem beschriebenen Fehler. Verwendet wurde die MFC 7.1 und kompiliert mit dem Visual Studio 7.1.3088.

    Laut Microsoft kommt CString::LoadString mit Unicode klar. Wenn man sich auf EXE-Dateien beschränkt stimmt dies.
    Der Fehler zieht sich auch bei Funktionen wie ::AfxMessageBox und CString::Format durch, da diese CString::LoadString verwenden.

    Lösung:
    Man benutze zum Laden von Strings aus einer Stringtabelle die SDK Funktion
    int LoadString
    (
    HINSTANCE hInstance,
    UINT uID,
    LPTSTR lpBuffer,
    int nBufferMax
    );

    Eine nähere Beschreibung dieser Funktion findet man unter:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/loadstring.asp

    Gruß, Lothar.



  • Dann zeigt doch mal eine Funktion aus der DLL.



  • Hallo!

    Ein mit Unicode nicht funktionierender Funktionsaufruf in einer DLL sieht z.B. so aus:

    CString strCompanyName;
    strCompanyName.LoadString(IDS_COMPANY_NAME);
    

    Ein mit Unicode auch funktionierender Funktionsaufruf in der DLL sieht z.B. so aus:

    CString strCompanyName=LoadString(_T("GDTDB.dll"), IDS_COMPANY_NAME);
    

    Wobei ich die eigentliche SDK Funktion LoadString in der folgenden Funktionsdefinition gekapselt habe:

    static CString LoadString(CString strModuleName, UINT uStringID)
    {
      CString str;
      HMODULE hOwn = GetModuleHandleW(strModuleName);
      int iResult=LoadString
      ( 
        hOwn,
        uStringID,
        (LPTSTR)str.GetBuffer(500),
        500
      );
      str.ReleaseBuffer();
      return str;
    }
    

    Gruß, Lothar.


Log in to reply