UpdateResource & Strings



  • Hallo,

    ich hab ein Problem mit dem Hinzufügen/Ändern eines Strings in ner externen Ressource.
    Also kurz Suchfunktion genutzt und nen Thread gefunden, wo jmd. genau das selbe Problem hatte:
    Informationen in andere EXE-Datei schreiben

    Da der Thread ziemlich alt ist, starte ich hier mal nen neuen...
    Wo liegt denn nun genau das Problem?

    Hier der Source:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
        HANDLE hUpdateRes;
        BOOL result;
        int an;
        char buff[] = "ein string";
        wchar_t szBuffer[256];
    
        an = MultiByteToWideChar(CP_ACP, 0, buff, lstrlen(buff), NULL, 0);
        MultiByteToWideChar(CP_ACP, 0, buff, lstrlen(buff), szBuffer, an);
    
        hUpdateRes = BeginUpdateResource("string.exe", TRUE);
        if(hUpdateRes == NULL)
        {
            MessageBox(NULL, "Datei kann nicht geöffnet werden.", "Fehler", MB_OK);
            return 1;
        }
    
        result = UpdateResource(hUpdateRes, RT_STRING, MAKEINTRESOURCE(101),
                                MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
                                szBuffer, 2*an);
        if(result == FALSE)
        {
            MessageBox(NULL, "Ressource konnte nicht hinzugefuegt werden.", "Fehler", MB_OK);
            return 2;
        }
    
        if(!EndUpdateResource(hUpdateRes, FALSE))
        {
            MessageBox(NULL, "Aenderungen konnten nicht geschrieben werden.", "Fehler", MB_OK);
            return 3;
        }
    
        return 0; 
    }
    

    Und wenn ich's mir dann mit "Resource Hacker" anschaue, kommt das bei raus:

    STRINGTABLE
    LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    {
    1600, 	"in string????????????????????????????????????????????????????????????????????????????????????????????"
    }
    


  • "szBuffer[0]" muß die Anzahl der Zeichen in "buff" enthalten.
    Der String ansich darf erst bei "&szBuffer[1]" beginnen.
    Anschließend muß die Länge noch korrigiert werden :

    ...
    // MultiByteToWideChar(CP_ACP, 0, buff, lstrlen(buff), szBuffer, an);
     MultiByteToWideChar(CP_ACP, 0, buff, lstrlen(buff), &szBuffer[1], an);
    ...
     szBuffer[0] = strlen (buff); // <- fehlt noch
    ...
     result = UpdateResource(...,2*an+4);
    ...
    


  • Danke, funktioniert 👍
    Hätte nicht gedacht, dass ich so schnell ne Antwort bekomme.


Anmelden zum Antworten