Länge von Resourcen - String ermitteln!



  • Hallo zusammen, gibt es eine Möglichkeit, die Länge eines Strings, der in einer Resource gespeichert ist, zu ermitteln? Sonst habe ich ja keine Ahnung, wie viel Speicher ich reservieren muss? Gruss Ishildur



  • Leider gibt es dafür nichts fertiges. Eine solche Funktion wartet noch darauf, von Dir programmiert zu werden. Vorab aber kannst Du Dir anders behelfen. Du forderst erstmal Speicher in einer sinnvollen Größe an. Wieviel sinnvoll ist, entscheidest Du.

    Mit diesem Speicher rufst Du nun LoadString auf. Ist der Speicher zu klein, bekommst Du von LoadString den Wert Speichergröße - 1 zurück. Jetzt vergrößerst Du den Buffer und rufst LoadString erneut auf. Das machst Du solange, bis die Differenz zur aktuellen Speichergröße > 1 ist.



  • Kann man da nicht auch mit SizeofResource etwas anfangen?! 🙄



  • flenders schrieb:

    Kann man da nicht auch mit SizeofResource etwas anfangen?! 🙄

    Nein, damit ist es nicht getan. Schau Dir mal die Hilfe zu FindResource an:

    MSDN schrieb:

    String resources are stored in sections of up to 16 strings per section. The strings in each section are stored as a sequence of counted (not null-terminated) Unicode strings. The LoadString function will extract the string resource from its corresponding section.

    Ein wenig Handarbeit ist da also schon noch nötig. 😉



  • Ist der Speicher zu klein, bekommst Du von LoadString den Wert Speichergröße - 1 zurück.

    Wo ist das denn dokumentiert?

    Bei Return Value von LoadString steht doch nur

    If the function succeeds, the return value is the number of TCHARs copied into the buffer, not including the null-terminating character, or zero if the string resource does not exist. To get extended error information, call GetLastError.



  • Genau auf dieses Zitat beziehe ich mich auch. Aber Du hast natürlich recht. Es gibt die Situation, in der der Buffer ganz genau die Größe hat, die benötigt wird. In diesem Falle würdest Du nach meiner Variante nochmals den Buffer vergrößen. Na und?



  • Ich frage mich warum die LoadString Funktion nicht wie (fast?) alle anderen derartigen Funktionen die "call with size 0, get
    size, call again with correct size" Idee nutzt. 👎



  • Kann man die Resource nicht einfach mit
    LoadResource und LockResource laden ?
    Dann müsste man doch nen strlen() benutzen können...



  • hat king doch schon was zu geschrieben..



  • geeky schrieb:

    Dann müsste man doch nen strlen() benutzen können...

    Nein, das geht nicht:

    • Die Strings sind in 16er Blöcken zusammengefasst. Und welchen nimmst Du für strlen?
    • Es handelt sich um UNICODE-Strings, damit kann strlen nichts anfangen.
    • Auch wenn Du wcslen nimmst, geht's nicht. Die strings sind nicht null-terminiert.

    Und gäbe es vernünftige Dokumentation, müssten wir hier nicht das große Rätselraten anfangen. Aber mit dem Debugger und seinem Memory-View kommt man schnell drauf, wie's funktioniert.

    Und da scheinbar Bedarf besteht, habe ich das jetzt mal 'zusammengefummelt'. Bislang habe ich es aber nur unter W2K getestet. Vielleicht können die Interessierten das mal auf anderen Plattformen probieren:
    http://www.winapi.net/index.php?inhalt=s43



  • Hmm, schon hat die Schule wieder angefangen bin ich auch schon wieder am verblöden und schaffe es irgendwie den halben Thread zu überlesen ;/


Anmelden zum Antworten