我最近开始在Windows上用C编写代码,并一直在尝试处理字符串缓冲区的不同方式。举例来说,GetWindowText()
需要一个int nMaxCount
字符的最大数量,包括空的。GetModuleFileName()
占用DWORD nSize
缓冲区的大小,以TCHARs为单位(我假设这也包括null)。即使这些词的措词不同,一个人花了DWORD
一段时间,而另一个人花了一个int
(为什么类型不同?),但行为是相同的,正确吗?
两者都返回复制的字符串的长度,不包括null,因此我应该能够重复调用它们中的任何一个,将缓冲区大小加倍,直到返回的长度小于传入的缓冲区大小为止,如下所示:
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
,我想我在枚举窗口时经常看到...
我想详细了解它的一个原因是,在某些情况下(GetModuleFileName()
例如,在WinXP上),我的代码中的错误代码将导致字符串不以null终止。
基本上,大多数返回字符串的Win32 API函数都以一致的方式执行此操作。GetWindowText
对于规范的此类功能是一个不错的选择。但是,也有例外,我认为没有人编写过全面的清单。
最重要的是,每次编写代码调用Win32 API函数时,都需要仔细查阅文档。不仅涉及字符串输出值的处理,而且涉及所有参数。以及所有返回值。和错误处理。整个API的样式都有差异,甚至相关功能组之间也有差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句