[英]Win32 Window Text issue
我在理解 Win32 API 中的GetWindowTextA()
function 時遇到問題。
根據 Microsoft 文檔, nMaxCount
是復制到緩沖區lpString
的最大字符數,包括 null 字符。
那么, GetWindowTextA()
是否會自動將 null 終止字符寫入緩沖區lpString
還是我必須手動將 null 終止字符添加到lpString
?
這是 Microsoft 文檔中的GetWindowTextA()
定義:
int GetWindowTextA(
[in] HWND hWnd,
[out] LPSTR lpString,
[in] int nMaxCount
);
這是代碼:
char M_Buff[20];
SetWindowTextA(M_SEND_EDIT_TEXT,"Hello World");
GetWindowTextA(M_SEND_EDIT_TEXT,M_Buff,20); //Do i have to add the null termination caracter into M_Buff myself or it is put automatically ?
printf("String is %s\n",M_Buff);
如果GetWindowTextA()
function 通過返回非零值報告成功,那么它還將終止 null 字符寫入 memory 緩沖區。 無需自己添加。
那個 function 的官方文檔沒有明確說明它總是會向字符串寫入一個 null 字符。 它只為被截斷的字符串的邊緣情況明確指定了這一點:
如果字符串與緩沖區一樣長或更長,則字符串將被截斷並以 null 字符終止。
但是,如果對於字符串不被截斷的一般情況,該語句也沒有這樣做,則該語句沒有意義。 因此,可以安全地假設當字符串沒有被截斷時它也會寫入一個終止 null 字符。
此外,文檔還指出以下內容:
如果 function 成功,則返回值為復制字符串的長度(以字符為單位),不包括終止 null 字符。
該語句還暗示它將終止 null 字符寫入緩沖區。
此外,正如其他答案之一指出的那樣,參數類型LPSTR
意味着在 function 返回后緩沖區將以空值終止。
只要您查看正確的文檔(SDK header 文件,尤其是winnt.h ),就不會涉及太多猜測。 這里有趣的部分是, LPSTR
不僅僅是一個指針,它還帶有一個SAL 注釋:
typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;
由於GetWindowTextA
使用LPSTR
作為它的_Out_
參數類型,因此它繼承了 SAL 注釋。
如果通過GetWindowTextA
實現的路徑沒有零終止 output 緩沖區,那么這將產生構建錯誤,並且不會有User32.dll 。 如果您的系統中有一個User32.dll模塊,您可以放心地假設它的實現符合 SAL 注釋。 具體來說,傳遞給GetWindowTextA
的緩沖區在返回時總是以零結尾(不管 function 調用是成功還是失敗)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.