1

使用 Visual c++ 6.0,我创建了一个基于 ATL 的 .EXE 服务器。(VC6 因为我正在处理遗留代码,.exe 服务器因为我需要在进程外上下文中测试操作,目前 .exe 服务器本质上是无操作的)

我已经构建并注册了相应的代理存根 DLL。

我有一个客户端应用程序

  1. IUnknown 的 CoCreateInstance 在服务器对象中调用 FinalConstruct 并成功(因此服务器被正确调用)
  2. 返回的IUnknown接口的OleRun成功
  3. 我的服务器对象的 IUnknown 指针上的 QueryInterface 失败,IMarshall 接口的错误代码为 0x8000402(不支持此类接口)

这些步骤是从 (comip.h::CreateInstance) 复制的

问题似乎是没有调用proxystub dll(它没有出现在IDE的模块列表中,也没有出现在调试窗口的加载模块列表中)

我的班级和界面的 OleCom 对象查看器可以在这里看到https://skydrive.live.com/redir?resid=AE43106917EBD9E1!191&authkey=!AIOWeS5P3o2mlpw

8891..ca4d 是我的对象的类接口 ID

A298...420c 是我的服务器对象的接口 ID(基于 IDispatch)

TIA 提供任何帮助

4

1 回答 1

0

您的问题可能是实现 IRunnableObject 接口的组件未在运行对象表中注册自身。这意味着 CoCreateInstance 本身会成功,但是,当它调用对象时,RPC 代码将无法找到它。

此 MSDN 页面指示: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms694517 (v=vs.85).aspx

    Notes to Implementers
    The object should register in the running object table if it has a 
    moniker assigned. The object should not hold any strong locks on itself; 
    instead, it should remain in the unstable, unlocked state. The object 
    should be locked when the first external connection is made to the object.

我有点担心你为什么还要使用 IMarshall 界面。通常不需要编写自定义编组代码,因此您不需要使用此接口。

只要您不引用自定义接口,就会使用 ole32.dll 或 oleauto32.dll 中的默认编组器。这很可能是您看不到代理正在加载的原因。

    In the case of most COM interfaces, the proxies and stubs for standard 
    marshaling are in-process component objects which are loaded from a 
    systemwide DLL provided by COM in Ole32.dll.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms692621(v=vs.85).aspx

于 2012-05-29T00:07:03.953 回答