c++ - 使用 nBufferMax 等于 0 的 LoadString

标签 c++ winapi

我正在努力使我的申请国际化。在 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/

相关文章:

c++ - std::vector 初始化元素的 move/复制构造函数

c++ - 我需要 2 个套接字来进行多播发送和单播读取吗?

时间:2019-03-09

windows - 您如何允许 MDI 应用程序中的窗口离开其带有 Win32 的父容器?

c++ - 计算 Eigen::Matrix 的 sign() 的最佳方法

winapi - Windows wchar_t如何处理基本多语言平面之外的Unicode字符?

C++ MessageBox 字符数组

windows - 继承 Windows ThreadHandle

python - Windows 与 Python Hook

c++ - 第 4 次射击声明在 SFML 游戏中不起作用