我最近开始在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结尾的字符串。