예성곤 님이 쓰신 글 :
: Windows 10 64비트에서 XE4 사용 중입니다.
:
: 아래 레지스트리 찾는 코드입니다.
: 실행 파일을 관리자 권한으로 설정하여 실행시켰지만 경로명이 올라오지 않습니다.
:
: WIndows 7 32비트에서는 잘되는 코드입니다만....
:
:
: String RGSKey = "\\SOFTWARE\\GPL Ghostscript\\9.15";
:
: TRegistry *TReg = new TRegistry;
: TReg->RootKey = HKEY_LOCAL_MACHINE;
: bool sResult = TReg->OpenKey(RGSKey,true);
: if (!sResult) {
: MessageDlg("Ghost Script 9.15가 설치되어 있지 않습니다.", mtError, TMsgDlgButtons() << mbOK, 0);
: return;
: }
: String FGSPath = ExtractFilePath(TReg->ReadString("GS_DLL"));
: TReg->CloseKey();
: delete TReg;
:
:
답변:
64bit OS에서 프로그램을 64bit로 컴파일해서 만들었다면 위의 코드는 아무런 문제가 없을 겁니다.
64bit OS 에선 커널, 디바이스 드라이버 및 시스템 dll 들 또한 64bit로 구성되어 있고... 64bit OS에서 32bit Application들은
별도의 32bit 포션들이 존재하지만 Thunk 레이어를 통해서 32bit와 64bit간에 프로세스 모드를 전환하면서 결국은 64bit 서비스
코드들을 호출하게 됩니다.
64bit OS에선 시스템 디렉토리 액세스, 레지스트리 하이브 액세스 등과 관련해서 Redirection 을 이용한 Virtualization이
이용되는데 (
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=free&no=25126 참고)
64bit OS 에서 32bit 애플리케이션이 위와 같은 레지스트리 하이브를 액세스 하려면 아래와 같이 명시적으로 지정을 하므로써
Redirection Virtualization을 바이패쓰 할 수 있습니다.
TRegistry *reg = new TRegistry(KEY_READ|KEY_WOW64_64KEY);
64bit OS의 가장 기본적인 특성을 간과 하고 있는 듯...