C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1177] 64Bit 윈도에서 32Bit 어플로 Windows/System32 내의 실행화일 구동방법.
김태선 [cppbuilder] 1457 읽음    2016-05-16 13:21
WinExec 나 ShellExecute로 실행하려고 하면 안됩니다.

32bit 어플에서는 윈도 시스템 디렉토리에 있는 파일을 실행하려고 하면
실행할수 없다는 메시지를 받게 됩니다.

이는 OS가 64Bit이기 때문에 시스템 폴더의 파일을 호출하게 되면
x64용 시스템 폴더의 실행파일이 실행되기 때문에 발생하는 문제입니다.
즉 32bit용 어플과 64Bit용 어플이 시스템 폴더에 동시에 존재하는데,
32Bit용 프로그램에서 시스템 폴더내 프로그램을 호출 실행하는 경우,
System32 폴더에서 64비트용 폴더로 리디렉션(Redirection)을 하기 때문에
실행이 안되는 문제가 생기는 것입니다.

그래서 이를 금지하는 아래와 같은 코드를 사용하면 실행 할수 있습니다.
실행후 다시 원래대로 돌려주면 모든게 해결됩니다.

역시 쓱~ 긁어 쓰기 좋은 코드로 인터넷 열심히 뒤져서 구성 했습니다.



// 시스템 폴더에 있는 프로그램을 실행시켜주는 함수
// 이 함수는 반드시 64Bit OS일때만 호출되어야 한다.
// Only x64 Process

bool	RunWow64Exe(char *exe_filename)
{
	typedef BOOL (WINAPI *FWOW64DISABLEWOW64FSREDIRECTION)(PVOID *);
	typedef BOOL (WINAPI *FWOW64REVERTWOW64FSREDIRECTION)(PVOID);

	PVOID OldValue = NULL;
	HMODULE hMod = GetModuleHandle("Kernel32.dll");
	if ( !hMod )
	{
		   return false;
	}

	{
		FWOW64DISABLEWOW64FSREDIRECTION fWow64DisableWow64FsRedirection;
		fWow64DisableWow64FsRedirection = (FWOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(hMod, "Wow64DisableWow64FsRedirection");
		if (fWow64DisableWow64FsRedirection && fWow64DisableWow64FsRedirection(&OldValue) )
		{
			SHELLEXECUTEINFO info;
			memset(&info, 0, sizeof(SHELLEXECUTEINFO));
			info.cbSize = sizeof(SHELLEXECUTEINFO);
			info.fMask = SEE_MASK_NOCLOSEPROCESS;
			info.hwnd = NULL;

			info.lpVerb = "open";
			info.lpFile = exe_filename;
			info.lpDirectory = "C:\\Windows\\system32";  // 이건 시스템 폴더를 얻어서 더 정확히 하는게 좋음.
			info.lpParameters = "";
			info.nShow = SW_SHOW;
			info.hInstApp = NULL;

			ShellExecuteEx(&info);

			{
				FWOW64REVERTWOW64FSREDIRECTION fWow64RevertWow64FsRedirection;
				fWow64RevertWow64FsRedirection = (FWOW64REVERTWOW64FSREDIRECTION)GetProcAddress(hMod, "Wow64RevertWow64FsRedirection");

				// Revert Redirection
				if( !fWow64RevertWow64FsRedirection(&OldValue) )
				{
					  return false;
				}
			}
			return true;
		}
	}
	return false;
}


+ -

관련 글 리스트
1177 64Bit 윈도에서 32Bit 어플로 Windows/System32 내의 실행화일 구동방법. 김태선 1457 2016-05-16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.