尝试在Visual Studio 2010中编写一个简单的注册表检查脚本,在XP SP3 x86上运行。
构建时不会抛出任何错误,但在调试时,程序将退出,并显示以下错误:
程序入口点RegGetValueA 无法定位在动态中 链接库ADVAPI32.dll
以下是该计划的全部代码。
// #define _WIN32_WINNT 0x0501
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
long reg = RegQueryValueEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", NULL,NULL,NULL,NULL);
// if (reg!=ERROR_SUCCESS) MessageBox(0, "Error Opening Registry Key", "Error", 0);
return 0;
}
上面代码中的评论根据wmeyer的回答添加 取消注释时,代码不会以该错误退出,但会引发不同的错误:
Test5.exe的调试信息 无法找到或不匹配。 二进制文件不是用调试构建的 信息。你想继续吗 调试?
如果我继续,MessageBox会弹出“Error Opening Registry Key”。
我尝试用以下三种方法替换RegQueryValueEx函数,一次一个
我知道他们中的两个只是VISTA,但我想知道错误是否会有所不同。
事实并非如此。
long reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, hKey);
// Vista+ PHKEY hKey;
long reg = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", hKey);
long reg = RegGetValue(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", "", RRF_RT_ANY, NULL, NULL,NULL);
我已经失去了几个小时试图解决其他几个错误,例如“无法将参数1从'char'转换为'LPCWSTR'” - 这已由changing the configuration解决 和“找不到或打开PDB文件”,由changing the configuration解决。
同样,问题要明确:
我的电脑肯定在Windows / syatem32中有一个advapi.dll文件。
编辑:
当答案指出它有多清楚时,完全重写了这个问题。
最初我假设Visual Studio 2010不向后兼容XP
我被强烈地告知这是不正确的,但仍然无法让VS工作。
答案 0 :(得分:3)
如果您希望代码在XP或早期系统中运行,请使用RegQueryValueEx。
无论如何,您应首先查看文档,然后搜索Google。 Win32 API有很好的文档记录,其中包含retrieving data from the registry的详细信息以及每个函数页面中支持的操作系统信息,例如: XP 64bit及更高版本支持RegGetValue。
答案 1 :(得分:2)
您应该将_WIN32_WINNT设置为您要定位的Windows版本。
见这里:http://msdn.microsoft.com/en-us/library/aa383745(v=vs.85).aspx#setting_winver_or__win32_winnt