2011-02-28 112 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