具有字符串输出参数的 WinAPI 函数有多少一致性?
Posted
技术标签:
【中文标题】具有字符串输出参数的 WinAPI 函数有多少一致性?【英文标题】:How much consistency is there with WinAPI functions that have string out parameters? 【发布时间】:2014-10-03 15:29:49 【问题描述】:我最近开始在 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()
),我的代码中的一个错误会导致字符串不是以空值结尾的。
【问题讨论】:
【参考方案1】:总的来说,大多数返回字符串的 Win32 API 函数都以一致的方式执行此操作。 GetWindowText
是规范此类功能的不错选择。但是,也有例外,我认为没有人编制过一份完整的清单。
这里的底线是,每次编写代码以调用 Win32 API 函数时,都需要仔细查阅文档。不仅关于字符串输出值的处理,还包括所有参数。以及所有返回值。和错误处理。 API 的风格各不相同,甚至相关的函数组也各不相同。
【讨论】:
以上是关于具有字符串输出参数的 WinAPI 函数有多少一致性?的主要内容,如果未能解决你的问题,请参考以下文章