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