RegEnumValueW返回值234,什么情况?

本文详细解析了在使用RegEnumValueW函数读取注册表时遇到的问题,当返回值为234时,无法正确获取键值字符串。通过调整代码,对返回值进行处理,确保了注册表操作的完整性。

最近不少反馈说字体少了,于是排查了一下,居然是注册表查询的时候丢弃了,问题就出在RegEnumValueW这个函数上。

 

经过一番debug,查到RegEnumValueW返回值为234,然后无法获取键值的字符串。查询了一下,在winerror.h有记录。

win error

所以只能改改代码,对返回值进行处理。

下面是完整的读注册表操作:


		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);
	}
	//.....

### 返回值在编程中的作用和用途 #### 1. 返回值的基本概念 返回值是函数执行完成后向调用者传递的结果。它允许函数将计算结果反馈给调用它的程序部分,从而实现数据的传递和交互[^1]。例如,在C语言中,函数可以通过`return`语句返回一个值,该值可以被赋值给变量或用于其他表达式中。 #### 2. 返回值的主要用途 - **终止函数运行**:当函数遇到`return`语句时,会立即停止执行并返回到调用处。这种机制可以简化逻辑控制,特别是在需要提前退出函数的情况下[^1]。 - **传递计算结果**:返回值的主要功能之一是将函数内部的计算结果传递给调用者。例如,数学函数通常会返回计算结果: ```c int add(int a, int b) { return a + b; // 返回两个数的和 } ``` - **作为表达式的一部分**:返回值可以使函数成为更大的表达式的一部分,增强代码的灵活性。例如: ```c if (add(3, 5) > 7) { printf("Sum is greater than 7\n"); } ``` #### 3. 返回值在不同场景中的应用 - **错误处理**:许多函数通过返回值来指示操作是否成功。例如,文件操作函数可能返回非零值表示成功,零值表示失败。 - **多分支逻辑控制**:在复杂逻辑中,多个`return`语句可以用来实现多分支控制,避免冗长的条件嵌套[^1]。 - **动态生成函数**:在某些高级语言(如Python)中,返回值可以是一个函数对象,从而实现高阶函数的功能[^2]。例如: ```python def make_multiplier(factor): def multiply(number): return number * factor return multiply double = make_multiplier(2) print(double(5)) # 输出10 ``` #### 4. 返回值与线程安全 在多线程环境中,返回值的设计需要特别注意线程安全性。如果函数依赖于全局变量或共享资源,可能会导致不可预测的结果。为了解决这一问题,可以使用信号量或其他同步机制来确保返回值的正确性[^3]。 #### 5. 返回值与效率 在某些情况下,直接返回值可能不如通过指针或引用传递参数高效。例如,当需要返回大块数据时,使用指针可以避免数据复制的开销[^4]。以下是一个示例: ```c void get_large_data(int *data, int size) { for (int i = 0; i < size; i++) { data[i] = i * 2; } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值