我有一个进程内COM服务器,我想为其构建32位和64位版本。我可以毫无问题地做到这一点。但是,当两个版本都注册时,我遇到了一些问题。
我没有使用ATL。在我的DllRegisterServer函数中,我使用的是RegisterTypeLibForUser。我通过使用我的DLL路径调用ITypeLib来获取RegisterTypeLibForUser调用的LoadTypeLibEx实例,并且我正在使用REGKIND_NONE标志。我正在使用.idl和MIDL编译器创建我的类型库。我在我的.dll中嵌入了类型库作为资源。鉴于下面的前两个子弹(一切都按预期工作),我的方式似乎没有任何问题。
看来,当我注册这两个服务器时,后一个RegisterTypeLibForUser调用会阻止上一次RegisterTypeLibForUser调用的注册表设置。
至于我得到的错误:
我正在尝试挖掘我的注册表,并确定在注册发生时究竟发生了什么变化,但由于注册表重定向器,这并不是那么简单。当我发现注册表信息时,我将更新这篇文章。
答案 0 :(得分:4)
想出来。
当在64位操作系统上运行时,RegisterTypeLib和RegisterTypeLibForUser总是写入32位和64位条目(即使进程是32位)。在大多数情况下,这是完全可以接受的,因为它只是编写的接口和类型库元数据。当写入接口键时,RegisterTypeLib / RegisterTypeLibForUser将ProxyStubClsid32设置为适用于接口类型的通用默认p / s(双重,自动化等)。但是,通用代理/存根似乎不适用于自定义异步接口上的ICallFactory。我修改了我的注册例程,以便始终在32位和64位注册表项中设置自定义代理/存根信息。这样可以确保以后的注册不会在以前的注册中胜过这些信息。
[更新]:最后,由于可用的APIS存在一些缺点,我不得不编写自己的注册程序: