注册32位和64位DLL

时间:2012-05-02 14:31:53

标签: dll com 64-bit 32-bit regsvr32

我正在引用这个帖子

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;
}

2 个答案:

答案 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文件夹位置。