2014-10-03 30 views
2

我最近开始在Windows上使用C编写代码,并一直在尝试处理字符串缓冲区的不同方式。例如,GetWindowText()取最大字符数int nMaxCount,包括空值。 GetModuleFileName()在TCHARs中占据了缓冲区大小的DWORD nSize(我认为这也包括空值)。即使这些措辞不同,一个采取DWORD而另一个采取int(为什么类型差异?),行为是相同的,正确的?WinAPI函数具有字符串输出参数有多少一致性?

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

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; 
} 

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

事实上,我刚注意到这两者的返回值并不完全一致:GetModuleFileName()返回0时出错; GetWindowText()将返回0每当有对窗口的文本,我想我看到相当频繁,当我枚举窗口为空字符串...

一个原因我想了解它的细节是,因为在某些情况下(GetModuleFileName()例如在WinXP上),我的代码中的错误代码会导致一个不以null结尾的字符串。

回答

6

大体上,返回字符串的大部分Win32 API函数都以一致的方式进行操作。 GetWindowText是一个典型的这种功能的不错的选择。然而,也有例外,我认为没有人编制过全面的清单。

这里的底线是,您需要仔细阅读文档,每次您编写代码来调用Win32 API函数。不仅涉及字符串输出值的处理,还涉及所有参数。和所有返回值。和错误处理。整个API的风格有所不同,甚至在相关功能组内也有差异。

相关问题