我正在努力使我的申请国际化。在 msdn 上研究了两天后,我想出了一个测试,它加载了包含资源的特定语言库。这也是我第一次尝试将库作为资源加载,从中加载字符串等等。
接下来根据msdn例子在http://msdn.microsoft.com/en-us/library/windows/desktop/dd319071%28v=VS.85%29.aspx ,我正在尝试 LoadString。
由于整个应用程序的字符串加载等于大量文本复制,我想我会使用 - 我认为是 - LoadString 的内存高效功能,即将 nBufferMax 参数设置为零。根据 LoadString 文档,它应该返回一个指向字符串资源的指针。我想我会制作一个结构或一类字符串指针并按照这些行做一些事情(我只提取了重要的位):
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);
}
如您所见,我正在尝试让 myString 成为指向已加载资源库字符串的指针,而无需实际复制任何内容。 我的问题是:我是否误解了 msdn 文档?我能不能直接在加载的库中获取指向字符串的指针,然后简单地使用它,例如显示一个消息框,而不实际复制任何东西?直到我卸载所述库?
最佳答案
MSDN 说:
[...] If this parameter is 0, then lpBuffer receives a read-only pointer to the resource itself.
这意味着 a) 指针必须是 const wchar_t*
类型:
const wchar_t *myString;
和 b) 您必须将指针传递给指针并使用丑陋的转换:
int copied=LoadStringW(resContainer,IDS_APP_TITLE,(LPWSTR)&myString,0);
关于c++ - 使用 nBufferMax 等于 0 的 LoadString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8548049/