我最近開始在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結尾的字符串。