Pet*_*ust 2 c c++ string winapi
我最近开始在Windows上用C语言编写,并且一直在努力小心处理字符串缓冲区的不同方法.例如,GetWindowText()取int nMaxCount最大字符数,包括null.在TCHAR中GetModuleFileName()占用DWORD nSize缓冲区的大小(我假设这也包括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;
}
Run Code Online (Sandbox Code Playgroud)
使用string [out]参数的所有Windows API函数都以相同的方式工作吗?是否有任何单独的功能或功能组表现不同?(例如,以字节为单位取代缓冲区大小而不是字符的函数,或者取最大字符串长度不包括空字符或返回与这两者不同的值的函数)
实际上,我只是注意到这两者的返回值并不完全一致:当它出错时GetModuleFileName()返回0; 只要窗口文本有一个空字符串GetWindowText()就会返回0,我想我在枚举窗口时经常看到它...
我想详细了解它的一个原因是因为在某些情况下(GetModuleFileName()例如,在WinXP上),我的代码中的一个一个错误将导致一个非空终止的字符串.
总的来说,返回字符串的大多数Win32 API函数都以一致的方式执行此操作.GetWindowText对于规范这样的函数来说是个不错的选择.但是,也有例外,我认为没有人编写过综合列表.
这里的底线是,每次编写代码以调用Win32 API函数时,都需要仔细查阅文档.不仅涉及字符串输出值的处理,还涉及所有参数.并且所有返回值.和错误处理.API中的样式存在差异,甚至相关功能组内也存在差异.