簡體   English   中英

Win32 Window 文字問題

[英]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 調用是成功還是失敗)。

雖然GetWindowTextA function 的文檔對於如果返回的字符串沒有被截斷會發生什么並不完全明確(如果它被截斷,那么明確說明包含終止 null 字符),我們可以推斷它是(或應該be) 總是從lpString的參數類型的定義以空終止,即LPSTR

該類型的文檔中

LPSTR指向 8 位 Windows (ANSI) 字符的空終止字符串的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM