无法使用代理存根dll创建com对象

时间:2012-05-23 02:36:47

标签: visual-studio com atl

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

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

我有一个客户端应用

  1. IUnknown的CoCreateInstance,它在服务器对象中调用FinalConstruct并成功(因此服务器被正确调用)
  2. 返回的IUnknown接口的OleRun成功
  3. 我的服务器对象的IUnknown指针上的QueryInterface失败,错误代码为0x8000402(不支持此接口)IMarshall接口
  4. 这些步骤是从(comip.h :: CreateInstance)

    复制而来的

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

    The OleCom Object viewer for my class and interface can be seen here https://skydrive.live.com/redir?resid=AE43106917EBD9E1!191&authkey=!AIOWeS5P3o2mlpw

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

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

    任何协助的TIA

1 个答案:

答案 0 :(得分: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