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;
}
|