카테고리 없음

비스타 64비트, ActiveX컨트롤 등록문제

쫑환이 2012. 3. 24. 23:44

비스타 64비트에서 권한상승 ActiveX컨트롤을 불러오는 CoCreateInstanceAsAdmin()함수가 실패했다.
에러코드는 0x80080015 이다.
이유를 찾아보니 권한상승 컨트롤 등록시 "LocalizedString" 값이 누락된 경우 발생한다고 나와있다.
해서 레지스트리 편집기를 열어보니... 다음과 같이 되어 있었다.

LocalizedString @C:\Windows\System32\UpCtrl.dll,-101

왜 그럴까? 64비트 시스템 디렉토리로 다음과 같이 수동으로 바꿔 주니까 에러없이 잘 동작되었다.
LocalizedString @C:\Windows\SysWOW64\UpCtrl.dll,-101

권한상승 컨트롤 설치시 다음과 같은 코드를 넣어서 문제를 해결했다.
비스타 나온지도 오래 되었는데... 64비트는 이제야 설치해보고 테스트해보네..휴~

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS 
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process");

BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;
 
    if (NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
        {
            // handle error
        }
    }
    return bIsWow64;
}


STDAPI DllRegisterServer(void)
{
 if (비스타운영체제면) {
  
  ...
   
  //64비트 운영체제이면...
  if (IsWow64())
  {
   TCHAR buf[MAX_PATH];
   memset(buf, 0, sizeof(buf));
   GetSystemWow64Directory(buf, MAX_PATH);

   CString sBuf;
   sBuf.Format(_T("@%s\\UpCtrl.dll,-101"), buf);

   //MessageBox(NULL, sBuf.GetBuffer(0), _T("REG"), MB_OK);
   HKEY hKey;
   if (RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID\\{YourClassID}"), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
   {
    RegSetValueEx(hKey, _T("LocalizedString"), 0, REG_SZ, (const BYTE*)sBuf.GetBuffer(0), sBuf.GetLength()*sizeof(TCHAR));
    RegCloseKey(hKey);
   }   
  }
  
 }

}