2

我最近开始在Windows上用C语言编写,并且一直在努力小心处理字符串缓冲区的不同方式。例如,获取窗口文本()需要一个int nMax计数最大字符数,包括null。获取模块文件名()需要一个DWORD n大小缓冲区的大小,以TCHAR表示(我假设这也包括null)。尽管这些词用词不同,但达沃德而另一个需要整数(为什么类型不同?),行为是相同的,对吗?

两者都返回复制的字符串的长度,包括null,所以我应该能够重复调用它们中的任何一个,将缓冲区大小加倍,直到返回的长度小于传入的缓冲区大小,如下所示:

DWORD buf_size=1024;DWORD返回值;wchar_t*full_path=malloc(buf_size*sizeof(wchar_t));//加倍缓冲直到足够大while((return_val=GetModuleFileNameW(NULL,full_path,buf_size))==buf_signe){buf_size*=2;full_path=realloc(完整路径,buf_size*sizeof(wchar_t));}if(!return_val){fprintf(stderr,“GetModuleFileNameW()出错”);返回NULL;}

所有带字符串[out]参数的Windows API函数都以相同的方式工作吗?是否存在行为不同的单个功能或功能组?(例如,以字节而不是字符为单位的缓冲区大小的函数,或者以最大字符串长度为单位的函数包括空字符或返回与这两个不同的值)

实际上,我刚刚注意到这两个变量的返回值并不完全一致:获取模块文件名()收益0当它出错时;获取窗口文本()将返回0每当窗口文本有空字符串时,我想我在枚举窗口时经常看到它。。。

我想详细了解它的一个原因是,在某些情况下(获取模块文件名()例如,在WinXP上),我的代码中的一个off-by-one错误将导致一个不以null结尾的字符串。

1答案1

重置为默认值
7

总的来说,大多数返回字符串的Win32 API函数都是以一致的方式执行的。窗口标题对于规范的此类函数来说,是一个很好的选择。然而,也有例外,我认为没有人编制过一份全面的清单。

这里的底线是,每次编写调用Win32 API函数的代码时,都需要仔细查阅文档。不仅涉及字符串输出值的处理,还涉及所有参数。以及所有返回值。以及错误处理。整个API的风格各不相同,甚至在相关的函数组中也有所不同。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.