2014-10-03 67 views
2

我最近開始在Windows上使用C編寫代碼,並一直在嘗試處理字符串緩衝區的不同方式。例如,GetWindowText()取最大字符數int nMaxCount,包括空值。 GetModuleFileName()在TCHARs中佔據了緩衝區大小的DWORD nSize(我認爲這也包括空值)。即使這些措辭不同,一個採取DWORD而另一個採取int(爲什麼類型差異?),行爲是相同的,正確的?WinAPI函數具有字符串輸出參數有多少一致性?

均返回複製的字符串的長度,包括空,所以我應該能夠重複調用它們中的任,直到返回的長度小於傳入的緩衝區大小加倍緩衝區大小,如下所示:

DWORD buf_size = 1024; 
DWORD return_val; 
wchar_t *full_path = malloc(buf_size * sizeof(wchar_t)); 

// double the buffer until it's big enough 
while ((return_val = GetModuleFileNameW(NULL, full_path, buf_size)) == buf_size) { 
    buf_size *= 2; 
    full_path = realloc(full_path, buf_size * sizeof(wchar_t)); 
} 

if (!return_val) { 
    fprintf(stderr, "Error in GetModuleFileNameW()\n"); 
    return NULL; 
} 

所有帶有string [out]參數的Windows API函數都以相同的方式工作嗎?是否有任何單獨的功能或功能組的行爲有所不同? (例如,稱取以字節爲單位而不是字符的緩存器的大小,或功能採取最大字符串長度包括空字符或返回比這兩個不同的值)

事實上,我剛注意到這兩者的返回值並不完全一致:GetModuleFileName()返回0時出錯; GetWindowText()將返回0每當有對窗口的文本,我想我看到相當頻繁,當我枚舉窗口爲空字符串...

一個原因我想了解它的細節是,因爲在某些情況下(GetModuleFileName()例如在WinXP上),我的代碼中的錯誤代碼會導致一個不以null結尾的字符串。

回答

6

大體上,返回字符串的大部分Win32 API函數都以一致的方式進行操作。 GetWindowText是一個典型的這種功能的不錯的選擇。然而,也有例外,我認爲沒有人編制過全面的清單。

這裏的底線是,您需要仔細閱讀文檔,每次您編寫代碼來調用Win32 API函數。不僅涉及字符串輸出值的處理,還涉及所有參數。和所有返回值。和錯誤處理。整個API的風格有所不同,甚至在相關功能組內也有差異。

相關問題