Kitet
Kitet

Reputation: 883

LoadString with nBufferMax equal 0

i am working on making my applications international. After two days digging on msdn i came up with a test, which loads language-specific library containing resources. This is also my first attempt at loading library as a resource, loading strings from it and so on.

Next, according to msdn example at http://msdn.microsoft.com/en-us/library/windows/desktop/dd319071%28v=VS.85%29.aspx, i'm trying the LoadString.

Since string loading for entire application equals a lot of text copying, i thought i would use the - what i think is - memory efficient feature of LoadString, which is setting nBufferMax parameter to zero. According LoadString documentation, it should return a pointer to string resource. I thought i'd make a struct or a class of string pointers and do something along these lines (i extracted only the important bits):

wchar_t textBuf[SOMEVALUE]; // <-- this is how id DOES work
wchar_t *myString; // <-- this is how i would like it
HMODULE resContainer=LoadLibraryEx(L"MUILibENU.dll",NULL, LOAD_LIBRARY_AS_DATAFILE);
if(0!=resContainer){
  // this works OK
  int copied=LoadStringW(resContainer,IDS_APP_TITLE,textBuf,SOMEVALUE); 
  // this fails, also gives a warning at compile time about uninitialized variable used.
  int copied=LoadStringW(resContainer,IDS_APP_TITLE,myString,0);
}

As you can see i am trying to get myString to become a pointer to loaded resource library's string without actually copying anything. My question is: am i misunderstanding msdn documentation? Can i or can i not get a pointer to the string directly within loaded library, and simply use it later, e.g. to show a messagebox, without actually copying anything? Until i unload said library?

Upvotes: 4

Views: 2937

Answers (1)

Yakov Galka
Yakov Galka

Reputation: 72449

MSDN says:

[...] If this parameter is 0, then lpBuffer receives a read-only pointer to the resource itself.

It means that a) the pointer must be of type const wchar_t*:

const wchar_t *myString;

and b) you must pass a pointer to the pointer and use an ugly cast:

int copied=LoadStringW(resContainer,IDS_APP_TITLE,(LPWSTR)&myString,0);

Upvotes: 7

Related Questions