2011-02-28 109 views
1

试图在XP SP3 x86上运行的Visual Studio 2010中编写一个简单的注册表检查脚本。Visual C++错误:无法找到RegGetValueA

没有ERRS被套上打造,但在调试程序,出现以下错误退出:

The procedure entry point RegGetValueA could not be located in the dynamic link library 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的回答添加。
当取消注释,代码不与错误退出,但会引发不同的错误:

Debugging information for Test5.exe cannot be found or does not match. Binary was not built with debug information. Do you want to continue debugging?

如果我继续,在MessageBox会弹出“错误打开注册表项”。

我试着用以下三种其他方法替换RegQueryValueEx函数,一次一个。
我知道他们中的两个人是唯一的,但我想看看错误是否会有所不同。
不是。

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); 

我已经失去了几个小时试图找出其他一些错误,如“不能从‘字符’到‘LPCWSTR’转换参数1” - 这是由changing the configuration 解决,“无法找到或打开PDB文件“,由changing the configuration解决。

如此反复,问题是明确的:

  1. 如何处理错误?
  2. 当前卫没有Vista方法开始时,wmeyer建议添加标题以过滤仅限Vista的方法有哪些帮助?为什么程序仍然无法工作?

我的电脑肯定有Windows/syatem32中的advapi.dll文件。

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

+1

有肯定是在Windows的32位版本的'advapi32.dll'。使用Visual Studio 2010编写的应用程序绝对可以在Windows XP上运行。你安装了什么服务包到你的XP安装? – 2011-02-28 09:56:28

+0

VS2010当然可以用来编写Windows 7程序,而那些不会在XP上运行。使用'/ D_WIN32_WINNT = 0x0501'来隐藏编译器的Vista和更高版本功能。 – MSalters 2011-02-28 10:19:16

+0

VS 2010完全支持WinXP SP2或更新版本,只确保您不使用WinXP未提供的API调用。如果您需要在不使用SP2的情况下支持WinXP,或者甚至是Win2k,请查看http://stackoverflow.com/questions/2484511/can-i-use-visual-studio-2010s-c-compiler-with-visual-studio-2008s- c-runtime/3502056#3502056 – Suma 2011-03-02 13:20:06

回答

3

如果您希望您的代码在XP或较早的系统中运行,请使用RegQueryValueEx

无论如何,您应该首先查看文档,然后搜索Google。 Win32 API有很好的文档记录,其中详细介绍了retrieving data from the registry以及每个函数页面中支持的操作系统信息。 XP 64bit及更高版本支持RegGetValue

+0

我尝试过的功能是win2000 +,包括RegQueryValueEx(请参阅片段)。所有的错误都完全一样。 – SamGoody 2011-03-02 11:31:43

2

您应该将_WIN32_WINNT设置为您定位的Windows版本。

在这里看到:http://msdn.microsoft.com/en-us/library/aa383745(v=vs.85).aspx#setting_winver_or__win32_winnt

+0

我已经添加了以下头文件:#define _WIN32_WINNT 0x0501。它现在不显示上面的err,而是显示以下内容:“Test5.exe的调试信息找不到或不匹配。Binary没有用调试信息构建。是否要继续调试?”当我添加消息框(在上面的代码段中注释掉)时,它弹出一条消息“错误打开注册表项”。 – SamGoody 2011-03-02 11:40:48

+0

我不确定那里发生了什么。 - 您可以尝试在项目设置中而不是在头文件中设置_WIN32_WINNT 0x0501,以确保它是全局可见的。 (http://msdn.microsoft.com/en-us/library/hhzbb5c8.aspx)另外,请确保完成重建。 – wmeyer 2011-03-02 14:49:02