Windows 프로그램에서 프로그램 전원 켜기 자동 시작

2116 단어
며칠 전에 프로그램이 켜져서 자동으로 시작되는 기능을 실현해야 한다.곧 이 기능을 실현하는 코드를 찾았는데 주요한 사고방식은 등록표의 내용을 바꾸는 것이다.
BOOL   CMainWnd::SetAutoRun()//        
{  
	//     ,     
	HKEY hKey;

	//        
	LPCTSTR lpRun="Software\\Microsoft\\Windows\\CurrentVersion\\Run";

	 DWORD dwDisposition;

	//     Key
	long lRet=RegCreateKeyEx(HKEY_LOCAL_MACHINE,lpRun,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition);
	
	if (lRet==ERROR_SUCCESS)
	{
		char pFileName[MAX_PATH]={0};

		//          
		DWORD dwRet=GetModuleFileName(NULL,pFileName,MAX_PATH);

		//     key,    
		lRet=RegSetValueEx(hKey,"WorkAssist",0,REG_SZ,(BYTE*)pFileName,dwRet);

		//     
		RegCloseKey(hKey);
		return TRUE;
	}
}  

위의 이 함수는 현재 프로그램을 켜서 시작하도록 설정합니다.그러나 위의 프로그램이 실행된 후 등록표의'Software\\Microsoft\Windows\\CurrentVersion\\Run'에서 자신이 설정한'WorkAssist'항목을 보지 못했기 때문에 이 프로그램은 자동으로 시작할 수 없습니다.그리고 다시 인터럽트 디버깅을 하는 과정에서 RegCreateKeyEx 함수의 반환 값이 ERROR 이 아닌 것을 발견했다SUCCESS가 아닌 5로 ERROR에 진입SUCCESS의 정의 섹션, ERROR 검색SUCCESS 아래에 다음 행 매크로 정의가 있는 매크로도 있습니다.
//
// MessageId: ERROR_ACCESS_DENIED
//
// MessageText:
//
// Access is denied.
//
#define ERROR_ACCESS_DENIED              5L

       
이것은 RegCreateKeyEx 함수 반환 값이 5일 때 권한이 부족하다는 것을 의미하지만, 내가 RegCreateKeyEx를 호출할 때 지정한 여섯 번째 인자는 KEY 이다ALL_ACCESS, 이 매개 변수는 이 함수에 지정된 권한이 KEY 임을 나타내는 것처럼 보입니다ALL_ACCESS, 그러나 실제로 이 변경은 효과가 없는 것 같아서 이 사고방식을 따라 문제의 해결 방법을 찾았다.
프로젝트 속성 - 구성 속성 - 링크 - 목록 파일 - UAC 실행 레벨에서 Require Administrator(/level="require Administrator")로 설정하여 관리자로 Visual Studio를 다시 실행한 후
이 컴파일 설정을 변경하면 비주얼 스튜디오가 프로젝트를 다시 컴파일하고 비주얼 스튜디오에 '관리자 신분' 이라는 글자가 나타납니다.
이렇게 하면 프로그램이 실행되고 ERROR 로 돌아갑니다.SUCCESS에서 레지스트리를 수정합니다.이때 컴퓨터에 360 등 보안 소프트웨어가 설치되어 있으면 프로그램이 등록표를 수정할 것을 경고할 수 있다.허용 프로그램을 누르면 됩니다.
위의 프로그램이 정상적으로 실행될 수 있다면 좋겠지만 시스템이 64비트인데 비주얼스튜디오가 32비트를 선택했다면 등록표 재지정 문제가 발생할 수 있습니다."WorkAssist"를 "Software\Microsoft\\Windows\\CurrentVersion\\Run"에 설정하지 않고 "HKEY LOCAL MACHINE\SOFTWARE\Wow6432Node\"아래에 설정합니다.구체적으로 이 문장을 참고할 수 있다.

좋은 웹페이지 즐겨찾기