簡體   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