最近不少反馈说字体少了,于是排查了一下,居然是注册表查询的时候丢弃了,问题就出在RegEnumValueW这个函数上。
经过一番debug,查到RegEnumValueW返回值为234,然后无法获取键值的字符串。查询了一下,在winerror.h有记录。
所以只能改改代码,对返回值进行处理。
下面是完整的读注册表操作:
LONG result;
DWORD maxValueNameSize, maxValueDataSize;
result = RegQueryInfoKeyW(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, &maxValueDataSize, 0, 0);
if (result != ERROR_SUCCESS) {
return 0;
}
DWORD valueIndex = 0;
wchar_t *valueName = (wchar_t *)malloc(maxValueNameSize * sizeof(wchar_t));
unsigned char *valueData = (unsigned char *)malloc(maxValueDataSize * sizeof(wchar_t));
DWORD valueNameSize, valueDataSize, valueType;
do {
valueDataSize = maxValueDataSize;
valueNameSize = maxValueNameSize;
valueName[0] = 0;
valueData[0] = 0;
result = RegEnumValueW(hKey, valueIndex, valueName, &valueNameSize, 0, &valueType, valueData, &valueDataSize);
if (result == ERROR_MORE_DATA)
{
maxValueNameSize <<= 1;
maxValueDataSize <<= 1;
if (valueName)
{
free(valueName);
}
if (valueData)
{
free(valueData);
}
valueName = (wchar_t *)malloc(maxValueNameSize * sizeof(wchar_t));
valueData = (unsigned char *)malloc(maxValueDataSize * sizeof(wchar_t));
if (valueName && valueData)
{
continue;
}
}
valueIndex++;
if (result != ERROR_SUCCESS || valueType != REG_SZ) {
continue;
}
// Found a match
//wprintf(L"valueName=%s\n", valueName);
//wprintf(L"valueData=%s\n", (wchar_t *)valueData);
//....
} while (result != ERROR_NO_MORE_ITEMS);
if (valueName)
{
free(valueName);
}
if (valueData)
{
free(valueData);
}
//.....