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

时间:2009-10-30 19:06:44

标签: c++ windows

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

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

6 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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版本,它完成所有实际工作。

答案 2 :(得分:2)

LoadStringW是LoadString的Unicode版本。

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

答案 3 :(得分:0)

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

See MSDN

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我只是确认了 当资源编译器被指示为null终止字符串时, LoadString 返回的计数包括了终端NULL字符。为此,我们检查了可用于 LoadString 的输出缓冲区。

资源字符串默认为 not 为空。在那种情况下,返回的计数不包括终端空字符,如文档中所述,因为在将字符串复制到输出缓冲区之后,该函数会附加空值。

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

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

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