我最近开始在 Windows 上用 C 语言编写程序,并且一直在努力小心处理字符串缓冲区的不同方式。例如,GetWindowText()
获取最大字符数的 int nMaxCount
,包括 null。 GetModuleFileName()
采用缓冲区大小的 DWORD nSize
,以 TCHAR 为单位(我假设这也包括 null)。尽管它们的措辞不同,一个采用 DWORD
而另一个采用 int
(为什么类型不同?),行为是相同的,正确吗?
两者都返回被复制的字符串的长度,不包括空值,所以我应该能够重复调用它们中的任何一个,将缓冲区大小加倍,直到返回的长度小于传入的缓冲区大小,像这样:
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;
}
是否所有带有字符串 [out] 参数的 Windows API 函数都以相同的方式工作?是否存在行为不同的单个函数或函数组? (例如,以字节而不是字符为单位获取缓冲区大小的函数,或者获取最大字符串长度不包括空字符或返回与这两者不同的值的函数)
其实我只是注意到这两个的返回值并不完全一致:GetModuleFileName()
出错时返回0
; GetWindowText()
将在窗口文本有空字符串时返回 0
,我认为我在枚举窗口时经常看到这种情况...
我想详细了解它的一个原因是因为在某些情况下(例如,WinXP 上的 GetModuleFileName()
),我的代码中的一个差一错误将导致一个字符串那不是空终止的。
最佳答案
大体上,大多数返回字符串的 Win32 API 函数都以一致的方式执行此操作。 GetWindowText
是规范此类函数的不错选择。然而,也有异常(exception),我认为没有人编制过一份全面的 list 。
这里的底线是每次编写调用 Win32 API 函数的代码时都需要仔细查阅文档。不仅涉及字符串输出值的处理,还涉及所有参数。以及所有返回值。和错误处理。整个 API 的风格各不相同,甚至相关函数组之间也存在差异。
关于c++ - 具有字符串输出参数的 WinAPI 函数有多少一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182029/