빌더님은 천재.... 그래도 혹 아직도 저처럼 C++Builder6 사용하시는 분들 참고하시라고....
typedef BOOL (WINAPI *LPFN_Wow64DisableWow64FsRedirection) (PVOID *OldValue);
typedef BOOL (WINAPI *LPFN_Wow64RevertWow64FsRedirection) (PVOID OldValue);
LPFN_Wow64DisableWow64FsRedirection fnWow64DisableWow64FsRedirection = NULL;
LPFN_Wow64RevertWow64FsRedirection fnWow64RevertWow64FsRedirection = NULL;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
PVOID was;
HMODULE hModule = ::GetModuleHandle("kernel32.dll"); //kernel32.dll은 Windows가 시작될 때 이미 보호메모리 공간에 Load 됩니다.
//그러므로 if( hModule==NULL ) { } 할 필요가 없겠지요. 당연히히 핸들을 둘려줄 것입니다.
fnWow64DisableWow64FsRedirection = (LPFN_Wow64DisableWow64FsRedirection)::GetProcAddress( hModule, "Wow64DisableWow64FsRedirection" );
fnWow64RevertWow64FsRedirection = (LPFN_Wow64RevertWow64FsRedirection)::GetProcAddress ( hModule, "Wow64RevertWow64FsRedirection" );
if( fnWow64DisableWow64FsRedirection && fnWow64RevertWow64FsRedirection )
{
fnWow64DisableWow64FsRedirection(&was);
::ShellExecute(NULL, "open", "osk.exe", NULL, NULL, SW_SHOWNORMAL);
fnWow64RevertWow64FsRedirection(was);
}
//::FreeLibrary( hModule ); 사용하면 안됨, LoadLibrary와 쌍으로 사용, GetModuleHandle은 이미 불러진 핸들을 그냥 참조...
}
빌더 님이 쓰신 글 :
: 다음 부터 질문 올릴 때는, 사용하는 OS 버전이 XP인지 아니면 Win 7 인지..
: 그리고 Win 7이라면 32비트 버전인지 아니면 64비트 버전인지 그런 내용도 적어줘야
: 답변하는 분들도 편합니다.
:
: 이미 말씀드린 대로... Vista 이후 호환성 문제 때문에 Shell 펑션을 사용해 보라고 답변 드렸었죠.
:
:
: Window 7 64 비트 OS라면... 코드를 다음과 같이 작성해서 컴파일 해보세요.
:
:
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: Wow64DisableWow64FsRedirection(&prevSet);
: ShellExecuteW(0, L"open", L"osk.exe",0,0,SW_SHOW);
: Wow64RevertWow64FsRedirection(prevSet);
: }
:
:
:
:
: 위의 코드는...
:
: 64비트 OS 환경에서 32비트 프로그램이 시스템 디렉토리를 액세스하게 될 경우...
: 시스템 디렉토리의 Redirection 문제가 일어나는데.. 그런 문제를 피해서 동작이 제대로
: 될수 있도록 처리해주는 겁니다.