LoadStringW - winuser.h。它有什么作用?

问题描述 投票:0回答:6

我一直无法找到关于此功能的任何体面的文档。我正在使用的代码库使用winuser.h中一个名为LoadStringW的函数,该函数作为参数:(HINSTANCE hInstance, UINT uID, LPWSTR lpBuffer, int cchBufferMax)

这个功能是什么?它是为了什么?什么时候可以返回0?

c++ windows
6个回答
2
投票

LoadStringW是LoadString的Unicode版本。

文档说明“如果函数成功,则返回值是复制到缓冲区中的TCHAR数,不包括终止NULL字符,如果字符串资源不存在则返回零。要获取扩展错误信息,请调用GetLastError。”


6
投票

值得一提的是,几乎所有处理字符串的Win32 API都有'A'和'W'变体。

实际调用的变量由不以“A”或“W”结尾的宏的定义决定 - 这些宏名称通常被认为是API函数的名称(在本例中为LoadString())。 UNICODE构建将使用'W'名称,而非UNICODE构建将使用'A'名称。

有时您可能想要调用Unicode版本的API,即使构建不是Unicode,在这种情况下,您只需直接使用带有'W'的名称到最后(不需要经常需要)在Unicode构建中调用非Unicode API,但它是尽可能的。由于Windows的非Unicode版本已经过时,因此Microsoft已经开始越来越多地仅实现Unicode版本的API。请注意,在几乎所有情况下,API的非Unicode版本所做的全部是将ANSI / MBCS字符串转换为Unicode,调用“W”函数,然后进行清理。


3
投票

以下是LoadString()的文档:http://msdn.microsoft.com/en-us/library/ms647486%28VS.85%29.aspx

..以下是解释Windows API中ANSI和Unicode函数之间差异的文档:http://msdn.microsoft.com/en-us/library/cc500321.aspx

基本上,函数LoadString有两种版本,ANSI和Unicode。 LoadStringW是LoadString的特定于Unicode的版本。

编辑:为了清楚起见,实际上没有两个完全独立的功能。 ANSI版本实际上只是转换字符串并调用unicode版本,它完成所有实际工作。


0
投票

LoadStringW()是LoadString函数的WideCharacter版本。

See MSDN


0
投票

它使用适用于Win95和NT 3.51的Windows Unicode Layer从字符串表资源加载宽字符串。有关详细信息,请参阅MSDN(请参阅备注部分)。


0
投票

无数次,我刚刚确认当资源编译器指示null终止字符串时,LoadString返回的计数包括终端NULL字符。我这样做是通过检查我可用于LoadString的输出缓冲区来实现的。

默认情况下,资源字符串不会终止。在这种情况下,返回的计数排除了终端空字符,如文档中所述,因为在将字符串复制到输出缓冲区后,函数会附加null。

我怀疑这种行为是由于LoadString忽略了资源编译器被指示null终止字符串的事实。实际上,我怀疑它无法知道它们是什么。

关于你为什么要首先在你的资源字符串中终止你的资源字符串,当它们在没有它们的情况下正常工作,并且你的PE文件因此稍微小一点时,原因是LoadStringW上的LoadString的宽字符实现入口点,如果传入其中的缓冲区地址是NULL指针,则返回指向该字符串的指针,而不是将其复制到缓冲区中。除非您的字符串以null结尾,否则以这种方式使用LoadString会产生非常不受欢迎的结果。

由于资源字符串始终存储为Unicode(宽字符)字符串,因此LoadString的ANSI实现不能返回指针,因为字符串必须转换为ANSI;因此,它不能简单地复制。

© www.soinside.com 2019 - 2024. All rights reserved.