비스타 64비트, ActiveX컨트롤 등록문제
비스타 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);
}
}
}
}