我正在引用这个帖子
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 :(得分:1)
Windows无关紧要 - 执行注册的是regsvr32
。对于32位DLL使用32位版本的regsvr32
,对于64位DLL使用64位版本。
两个版本都只加载DLL,找到DllRegisterServer()
/ DllUnregisterServer()
入口点,调用它并观察返回的值。无论内部是什么,都不是regsvr32
业务。
你的问题是其中一个功能错误。你必须调试这个。一个好的开始是使用Process Monitor实用程序来观察执行的注册表访问以及它们是否符合您的预期。
答案 1 :(得分:0)
向answer from sharptooth添加更多信息,如果您通过优先使用regsvr32以编程方式取消注册您的dll,那么您可能正在调用错误的regsvr32文件。您需要确保从System32
调用regsvr32以取消注册64位dll,并从SysWow64
调用regsvr32以取消注册32位版本。您可以p / Invoke功能GetSystemWow64Directory来检索SysWow64文件夹位置。