繁体   English   中英

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

[英]LoadStringW - winuser.h. What does it do?

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

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

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

实际调用的变体由不以'A'或'W'结尾的宏定义所决定-这些宏名通常是您通常认为的API函数名称(在这种情况下为LoadString() )。 UNICODE版本将使用“ W”名称,非UNICODE版本将使用“ A”名称。

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

这是LoadString()的文档: http://msdn.microsoft.com/zh-CN/library/ms647486%28VS.85%29.aspx

..这是说明Windows API中ANSI和Unicode函数之间差异的文档: http://msdn.microsoft.com/zh-cn/library/cc500321.aspx

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

编辑:需要明确的是,实际上并没有两个完全独立的功能。 ANSI版本实际上只是转换字符串并调用unicode版本,它可以完成所有实际工作。

LoadStringW是Unicode版本加载链

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

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

参见MSDN

它使用Windows Unicode层Win95和NT 3.51从可字符串化的资源中加载一个宽字符串。 有关详细信息,请参见MSDN (请参阅备注部分)。

第三次,我只是确认, 当指示资源编译器将字符串终止为null时LoadString返回的计数包括终端NULL字符。 我通过检查可用于LoadString的输出缓冲区来做到这一点。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM