我在最近的一个项目中遇到了 LoadString 的奇怪行为。由于某种原因,如果我尝试加载一个将
cchBufferMax
设置为零的字符串来获取只读指针,LoadString 将返回一个 -1
,这似乎不属于记录的行为范围。如果我传入一个非零大小的缓冲区,则字符串会正确加载。
以下内容将返回
-1
并且 lpAppName
保持不变:
LPCSTR lpAppName;
LoadString(hInstance, IDS_APPNAME, reinterpret_cast<LPSTR>(&lpAppName), 0);
但是,以下内容按预期工作:
char cAppName[64];
LoadString(hInstance, IDS_APPNAME, cAppName, sizeof(cAppName));
在这两种情况下,
IDS_APPNAME
是相同的(#define
与 200
中的 resource.h
)。
有什么想法吗?
所有字符串资源本身都是 Unicode。但是您显然没有针对 Unicode 编译应用程序(通过使用
LPCSTR
可以明显看出),因此 LoadString()
映射到 LoadStringA()
,它可以将 Unicode 字符串复制到 ANSI 缓冲区中(如第二个示例中所示)但无法返回指向 Unicode 数据的直接 ANSI 指针。这是 MSDN 文档中关于 LoadStringA()
的错误。
要执行您正在尝试的操作,您需要使用
LoadStringW()
来代替:
LPCWSTR lpAppName = nullptr;
LoadStringW(hInstance, IDS_APPNAME, reinterpret_cast<LPWSTR>(&lpAppName), 0);