您好我正在尝试使用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");
}
如果有人有想法,请帮助我
答案 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字节解释为字符串终止符。