3

我指的是这个线程

如何安装 32 位和 64 位版本的 COM DLL 和“自动选择”?

我们的情况完全相同。来自同一个项目的具有相同 CLSID 应用 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;
}
4

2 回答 2

1

Windows 不在乎 - 它regsvr32执行注册。您regsvr32对 32 位 DLL 使用 32 位版本,对 64 位 DLL 使用 64 位版本。

两个版本都只是加载 DLL,找到DllRegisterServer()/DllUnregisterServer()入口点,调用它并观察返回值。无论进入什么都不是regsvr32生意。

您的问题是这些功能之一工作错误。你必须调试这个。一个好的开始是使用 Process Monitor 实用程序来观察执行了哪些注册表访问以及它们是否是您所期望的。

于 2012-05-02T14:44:37.940 回答
0

从 sharptooth 向答案添加更多信息,如果您通过执行 regsvr32 以编程方式注销您的 dll,那么您可能调用了错误的 regsvr32 文件。您需要确保调用 regsvr32System32来注销 64 位 dll,调用 regsvr32 来SysWow64注销 32 位版本。您可以 p/Invoke 函数GetSystemWow64Directory以检索 SysWow64 文件夹位置。

于 2012-05-02T14:53:57.257 回答