nBufferMax等于0的LoadString

时间:2011-12-17 21:27:03

标签: c++ winapi

我正在努力使我的应用程序国际化。在msdn上挖了两天后,我想出了一个测试,它加载了包含资源的特定于语言的库。这也是我第一次尝试将库加载为资源,从中加载字符串等等。

接下来,根据http://msdn.microsoft.com/en-us/library/windows/desktop/dd319071%28v=VS.85%29.aspx的msdn示例,我正在尝试使用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文档吗?我是否可以直接在加载的库中获取指向字符串的指针,并且稍后可以使用它,例如显示一个消息框,而不实际复制任何东西?直到我卸载库?

1 个答案:

答案 0 :(得分:4)

MSDN说:

  

[...]如果此参数为0,则lpBuffer接收指向资源本身的只读指针。

这意味着a)指针必须是const wchar_t*类型:

const wchar_t *myString;

和b)你必须传递指针指针并使用丑陋的演员:

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