如何使用C从注册表中读取存储在Key中的值

时间:2012-05-08 07:32:52

标签: c registry registrykey

您好我正在尝试使用C代码读取存储在注册表项中的值。我试过以下代码。它不会产生任何编译错误。但我只得到字符串的第一个字母作为输出。这是我的代码示例

#include "stdafx.h"
#include <windows.h>
#include <malloc.h>
#include <stdio.h>



#define TOTALBYTES    8192
#define BYTEINCREMENT 4096
#define BUFFER 8192



int _tmain(int argc, _TCHAR* argv[])
{
char value[255];
DWORD BufferSize = BUFFER;
RegGetValue(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Test\\subkey"), TEXT("blockedurlslist"), RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
printf("%s",value);
system("pause");
}

如果有人有想法,请帮助我

2 个答案:

答案 0 :(得分:1)

首先,您不会检查对RegGetValue的呼叫是否成功。始终检查Win32 API调用的返回值。

但正在发生的事情非常清楚。每当一个函数返回一个只包含第一个字符的字符串时,最可能的原因是该函数返回的UTF-16数据被解释为ANSI。您的字符串将包含一个英文字符,该字符以UTF-16编码,第二个字节为0。当解释为ANSI时,0被视为字符串终止符。

您需要将缓冲区声明为包含宽字符有效负载。由于您使用的是TCHAR,因此您可以这样做:

TCHAR value[255];

缓冲区大小为

DWORD BufferSize = sizeof(value);

您需要更改printf才能打印出宽字符串。

如果我是你,我就不会使用TCHAR。我建议您决定在整个代码中使用Unicode。这让你理解起来更加简单,我怀疑你最近需要支持Windows 98。

答案 1 :(得分:0)

回叫的电话是什么?如果它没有返回ERROR_SUCCESS,则失败。您可以在调用后检查BufferSize的值,以了解API声称返回的数据量。

正如评论中所指出的,你应该说:

char value[BUFFER];
DWORD BufferSize = sizeof value;

从现在开始,你正在向API说谎你的缓冲区大小,这会引起缓冲区覆盖。

也许它以16位字符返回数据,并且您使用8位调用进行打印,从而将散布的0字节解释为字符串终止符。