Visual C ++错误:无法找到RegGetValueA

时间:2011-02-28 09:49:23

标签: c++ visual-studio-2010 windows-xp backwards-compatibility

尝试在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解决。

同样,问题要明确:

  1. 如何处理错误?
  2. 如果编程没有开始使用Vista方法,那么wmeyer建议添加标题以过滤掉仅限Vista的方法有何帮助?为什么程序仍然不起作用?
  3. 我的电脑肯定在Windows / syatem32中有一个advapi.dll文件。

    编辑: 当答案指出它有多清楚时,完全重写了这个问题。
    最初我假设Visual Studio 2010不向后兼容XP 我被强烈地告知这是不正确的,但仍然无法让VS工作。

2 个答案:

答案 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