缓冲区可能足够大,您只是在对函数的实际大小撒谎。
当您对指针使用sizeof 运算符时,它返回指针的大小,而不是它指向的数组的大小。而且因为key 是作为char* 传递给函数的,所以它只是一个指向数组的指针,而不是数组本身。
您必须将缓冲区的实际大小与指针一起作为参数传递给函数:
DWORD regGetValue(char *key, size_t length, int index)
{
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey);
DWORD chars = length;
LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0 );
RegCloseKey(hKey);
return result;
}
char key[512];
int index = 0;
regGetValue(key, sizeof(key), index);
sizeof 运算符在这里按预期工作,因为它在数组本身上运行,而不仅仅是指向它的指针。这种方法虽然在 C API 中很常见,但很麻烦。
您可以通过使用自动推断缓冲区大小并将其传递给实际完成工作的内部辅助函数的函数模板来稍微简化调用站点的操作:
// Helper function, implemented as a private member of your class
DWORD regGetValue(char *key, size_t length int index)
{
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey);
DWORD chars = length;
LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0 );
RegCloseKey(hKey);
return result;
}
// The public function that you will actually call
template <size_t N>
DWORD regGetValue(char (&key)[N], int index)
{
return regGetValue(key, N, index);
}
char key[512];
int index = 0;
regGetValue(key, index); // length determined and passed automatically
之所以有效,是因为您将引用传递给数组,而不是指针。
除此之外,我必须认真质疑您为什么要调用 ANSI 函数并为字符串使用 char*。所有现代 Windows 应用程序都应该是 Unicode。这意味着调用 Windows API 函数的 W 后缀版本并使用 wchar_t* 作为您的字符串类型。确保为您的项目定义了 UNICODE 和 _UNICODE 符号,如果使用错误的类型,您将收到编译时错误。