1

XP SP3 x86에서 실행되는 Visual Studio 2010에서 간단한 레지스트리 검사 스크립트를 작성하려고 시도했습니다.Visual C++ 오류 : RegGetValueA를 찾을 수 없습니다.

아무 잘못한다 빌드에 던져,하지만 프로그램을 디버깅에 다음과 같은 오류로 종료됩니다 여기

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?

내가 계속하면, 메시지 박스는 "레지스트리 키를 열기 오류"로 나타납니다.

나는 한 번에 하나씩 다음 세 가지 다른 방법으로 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. wmeyer가 Vista 전용 메서드를 필터링하기 위해 헤더를 추가하는 제안은 어떻게 시작해야 할 Vista 방법이 없을 때 어떻게 도움이 되었습니까? 왜 프로그램이 여전히 작동하지 않습니까?

내 컴퓨터에는 Windows/syatem32에 advapi.dll 파일이 있습니다.

편집 : 대답이 명확하지 않은 점을 지적했을 때 질문을 완전히 다시 작성했습니다.
원래 Visual Studio 2010은 XP와 하위 호환되지 않는다고 가정했습니다.
나는 그것이 틀렸다는 것을 강하게 들었지만 여전히 VS가 작동하지 못한다.

+1

확실히 32 비트 버전의 Windows에'advapi32.dll' 있습니다.Visual Studio 2010으로 작성된 응용 프로그램은 Windows XP에서 실행됩니다. XP 설치에 어떤 서비스 팩을 설치 했습니까? –

+0

VS2010은 확실히 Windows 7 프로그램을 작성하는 데 사용될 수 있으며 XP에서는 실행되지 않습니다. 컴파일러에서 Vista 및 이후 기능을 숨기려면'/ D_WIN32_WINNT = 0x0501'을 사용하십시오. – MSalters

+0

WinXP SP2 이상은 VS 2010에서 완전히 지원되며 WinXP가 제공하지 않는 API 호출을 사용하지 않도록하십시오. SP2 나 Win2k가없는 WinXP를 지원해야하는 경우 http://stackoverflow.com/questions/2484511/can-i-use-visual-studio-2010s-c-compiler-with-visual-studio-2008s- c-runtime/3502056 # 3502056 – Suma

답변

3

XP 또는 이전 시스템에서 코드를 실행하려면 RegQueryValueEx을 사용하십시오.

어쨌든 먼저 문서를 확인한 다음 Google을 검색해야합니다. Win32 API는 매우 잘 문서화되어 있으며 retrieving data from the registry에 대한 세부 정보와 모든 기능 페이지에 지원되는 OS 정보가 들어 있습니다. RegGetValue은 XP 64 비트 이상에서 지원됩니다.

+0

나는 RegQueryValueEx (스 니펫 참조)를 포함하여 win2000 + 인 함수를 시도했다. 오류는 모두에게 똑같습니다. – SamGoody

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. 이제 위의 오류가 표시되지 않고 대신 다음과 같은 내용이 표시됩니다. "Test5.exe에 대한 디버깅 정보를 찾을 수 없거나 일치하지 않습니다. 이진 정보가 디버그 정보로 작성되지 않았습니다. 디버깅을 계속 하시겠습니까?" 위의 스 니펫에서 주석 처리 된 메시지 상자를 추가하면 "레지스트리 키 열기 오류"메시지가 나타납니다. – SamGoody

+0

나는 무슨 일이 일어나고 있는지 잘 모르겠습니다. - 헤더 파일 대신 프로젝트 설정에서 _WIN32_WINNT 0x0501을 설정하여 전체적으로 표시되도록 할 수 있습니다. (http://msdn.microsoft.com/en-us/library/hhzbb5c8.aspx) 또한 전체 다시 작성을 수행해야합니다. – wmeyer

관련 문제