2012-05-02 4 views
3

나는 우리가 정확히 같은 상황이이 스레드등록 32 비트 및 64 비트 모두 DLL을

How do I install both 32-bit and 64-bit versions of a COM DLL and "auto-select"?

로 다스 려하고있다. 같은 프로젝트에서 동일한 CLSID App ID를 가진 Dll 32 비트 및 64 비트 네임 스페이스 확장. 이제이 두 DLL을 등록하면 완벽하게 작동합니다. 등록을 취소하면 오류가 발생합니다. 첫 번째 등록이 작동하지만 두 번째 등록이 실패합니다. Windows (?)는 Dll이 이미 등록이 취소되었다고 생각하기 때문에 ...

두 개의 Dll에 다른 CLSID 및/또는 App ID가 필요합니까 ???

종류와 관련, 마이클

편집 : 여기의 DllUnregisterServer가하는 작업은 다음과 같습니다

STDAPI DllUnregisterServer(void){ 

    _AtlModule.UpdateRegistryAppId(FALSE); 
    HRESULT hRes2 = _AtlModule.UnregisterServer(TRUE); 
    if (hRes2 != S_OK) 
     return hRes2; 
    AFX_MANAGE_STATE(_afxModuleAddrThis); 

    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE)) 
     return ResultFromScode(SELFREG_E_CLASS); 

    return NOERROR; 
} 
+0

나는 "약간의 오류"가 무엇이 잘못되었는지에 대한 아이디어를 줄 것입니다. – sharptooth

+0

자세한 내용을 확인하면 오류 코드 0x8002801c가 표시됩니다. –

답변

1

윈도우는 상관하지 않는다 -는 등록을 수행 regsvr32을합니다. 32 비트 DLL에는 regsvr32의 32 비트 버전을 사용하고 64 비트 DLL에는 64 비트 버전을 사용합니다.

두 버전 모두 DLL을로드하고 DllRegisterServer()/DllUnregisterServer() 진입 점을 찾아 반환하고 반환 된 값을 관찰합니다. 내부에 들어가는 것은 무엇이든 regsvr32 사업이 아닙니다.

문제는 이러한 기능 중 하나가 잘못되었습니다. 이것을 디버깅해야합니다. 좋은 시작은 프로세스 모니터 유틸리티를 사용하여 수행되는 레지스트리 액세스와 예상 한 레지스트리 액세스를 관찰하는 것입니다.

+0

흠, 앱의 메인 프레임이 직접 코드화되지 않았습니다. 위의 코드에서 뭔가를 볼 수 있습니다. –

+0

@Jesse James : 추측하기는 불가능합니다. 프로세스 모니터를 사용하여 최소한 액세스를 검증하는 것이 좋습니다. – sharptooth

+0

좋아, 내가 그것을 시도하지만 regysvr32에 대한 100.000 항목을 creats, 내가 이것을 해결하기 위해 봐야 할 것에 대한 단서가 없다 ... –

0

answer from sharptooth에 정보를 추가하면 regsvr32를 excecuting하여 프로그래밍 방식으로 DLL을 등록 취소하는 경우 잘못된 regsvr32 파일을 호출 할 수 있습니다. regsvr32를 System32에서 64 비트 dll 등록을 취소하고 SysWow64에서 regsvr32를 호출하여 32 비트 버전을 등록 취소했는지 확인해야합니다. SysWow64 폴더 위치를 가져 오는 기능을 호출하거나 호출 할 수 있습니다. GetSystemWow64Directory.

+0

나는 Windows 7에서 이것을 시도하고 32 비트와 64 비트를 모두 처리 할 수 ​​있지만 SysWow64를 호출하는 시도 regsvr32.exe 그리고 그것은 둘 다 작동하지 않습니다. –

+0

이 경우에는 sharptooth가 제안한대로 DllUnregisterServer 기능에 잘못된 것이 있어야합니다. – yms

+0

디버깅이 어렵다. hRes2의 내용을 볼 수 없다. 항상 그 심볼을 찾을 수 없다고 말한다. 하지만 그것은 _AtlModule.UnregisterServer (TRUE)입니다. 어떤 것이 제대로 작동하지 않는 ... –