2011-06-12 3 views
5

응용 프로그램이 설치된 경로를 얻고 싶습니다. 레지스트리에 내 응용 프로그램의 경로를 제공하는 항목이 있습니다.이 스크린 샷을 참조하십시오. http://i56.tinypic.com/2ly1l6s.jpg레지스트리에서 값 읽기 C++

내 응용 프로그램이있는 경로를 읽고 싶습니다. 즉, 나는 C : \ Projects \ MyApplication \ MyApplication.exe 부분을 원한다. 여기에 무엇을하려고합니다 :

HKEY hKey; 
wchar_t mydata[2048]; 
DWORD dataLength = sizeof(mydata); 
DWORD dwType = REG_SZ; 
LPVOID messagecaliss; 
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\", 0, KEY_QUERY_VALUE, &hKey); 
GetLastError(); 
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
     NULL, GetLastError(), NULL,(LPTSTR) &messagecaliss, 0, NULL); 
if (regOpenCriss == ERROR_SUCCESS) { 
RegQueryValueEx(HKEY_CURRENT_USER, "TestApplication", 0, &dwType, (BYTE*)mydata, &dataLength); 
wprintf(L"%s\n", mydata); 
system("PAUSE"); 
} 
else 
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION); 

이것은 작동하지 않습니다, 정크 문자가 인쇄됩니다. 고맙습니다.

+0

사용하는 컴파일러/개발 도구를 지정하는 것이 유용 할 수 있습니다. – vsz

+0

Visual Studio C++ 2010, windows 7을 사용합니다. –

+0

argv []의 경로에 어떤 문제가 있습니까? – Andrei

답변

5

당신은 non-UNICODE 버전의 RegQueryValueEx를 ​​사용하고 있으며 당신은 printf의 와이드 char 버전으로 그것을 재생하고 있습니다. 하나의 printf 사용하거나 wprintf (L "%의 S", 다음 mydata)로 변경

참고 : RegQueryValueEx (HKEY_CURRENT_USER, ...) RegQueryValueEx해야합니다 (HKEY, ...)

+0

printf는 아무 것도 출력하지 않습니다. –

+0

쿼리하는 값이 있습니까? 그렇다면 RegQueryValueEx의 반환 값을 확인하십시오. –

+0

그리고 dwType이 [REG_SZ] (http://msdn.microsoft.com/en-us/library/ms724884(v= VS.85) .aspx)로 설정되어 있는지 확인하십시오. –

1

난 후 결과를 얻었다 :

  1. 는 내가 첫 번째 매개 변수로 hKeyRegQueryValueEx 전화
  2. _T()로 문자열을 둘러싸는

당신은 결과를 저장한다 변수에 RegQueryValueEx을 입력하고 확인하십시오. 실패 사례 처리 ...

0

제시하는 코드의 주된 문제점은 C 스타일의 캐스트가 있다는 것입니다. 각 캐스트는 버그 어트랙터입니다. 사실, 캐스트 중 일부는 버그입니다 (호환되지 않는 문자 유형을 사용하고 있음을 숨기고 있음).

내 응용 프로그램이있는 경로를 읽고 싶습니다.

GetModuleFileName을 사용하십시오.

MSDN docs :
은 완전한 경로를

건배를 취득 & HTH,

+0

아, 나는 호르몬이 싫어. 왜 하나님은 그들에게 마음을주지 않으셨습니까? –

+0

나는 downvoter 아니에요하지만 OP는 "다른"응용 프로그램이 설치되어있는 곳 중 현재 실행중인 곳이 아닌지 묻고 있다고 생각합니다. 그래서 GetModuleFileName 도움이되지 않습니다. –

+0

@Guy : 그는 "다른 응용 프로그램"이 아니라 "내 응용 프로그램"을 작성합니다. 그러나 그가 실제로 묻는 것보다 그가 생각하고있는 것이 맞을 수도 있습니다. 그 방향의 레지스트리 코드 포인트는 그렇습니다 - 그러나 다른 한편으로는, 또한'GetModuleFileName'에 대해 알지 못하는 방향을 가리키고 있습니다 ... ;-) –

1

이것은 당신이없는 것을 어떻게 알

작동하지 않습니다. RegQueryValueEx의 반환 값을 확인 하시겠습니까?

정크 문자 그것은 정크 아니다

번호를 인쇄됩니다. 너는 넓은 문자열을 요구하지 않았으므로 하나를 얻으 려하지 않을 것이다. 유니 코드를 사용하도록 컴파일하고 RegQueryValueExL"TestApplication" 또는 _T("TestApplication") 또는 TEXT("TestApplication")으로 호출하십시오. RegQueryValueEx은 컴파일시 유니 코드가 정의되어 있는지 여부에 따라 RegQueryValueExA 또는 RegQueryValueExW의 typedef입니다.

는 당신에게 당신은 환영합니다

대단히 감사합니다.

+1

+1은 말없는 drive-by downvoter를 카운터합니다. –

+0

당신은 가장 친절합니다. ;) –