具有字符串输出参数的 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 函数有多少一致性?的主要内容,如果未能解决你的问题,请参考以下文章

一个方法可以有多少个参数多少个返回值 Java

关于VC++的Winmain函数(WINAPI是啥?)

GetStdHandle函数使用方法

GetStdHandle函数使用方法

WINAPI中的消息部署函数应该设置啥样的参数

关于VC++的Winmain函数(WINAPI是啥?)