0

您好我正在尝试使用 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");
}

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

4

2 回答 2

1

首先,您没有检查调用是否RegGetValue成功。始终检查 Win32 API 调用的返回值。

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

您需要将缓冲区声明为包含宽字符有效负载。既然你正在使用,TCHAR那么你会这样做:

TCHAR value[255];

缓冲区大小为

DWORD BufferSize = sizeof(value);

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

如果我是你,我不会使用TCHAR. 我建议您决定在整个代码中使用 Unicode。它使您更容易理解,我怀疑您现在是否需要支持 Windows 98。

于 2012-05-08T08:13:04.273 回答
0

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

正如评论中指出的那样,您应该说:

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

从现在开始,您就缓冲区大小向 API 撒谎,这会导致缓冲区覆盖。

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

于 2012-05-08T07:59:54.193 回答