2

我正在在 EXE 文件中实现 COM 服务器。准确地说,我正在向现有应用程序添加一个 COM 接口。最终目标是自动化应用程序。

第一个组件和一个接口(到目前为止只有一个方法)基本就位。我可以在 DLL 中构建一个进程内服务器并成功获取接口指针并调用该方法。这是第一步,因为我只是在学习。以后我不需要 DLL;它只是作为我的组件和界面基本没问题的概念证明。

然后我在 EXE 中构建了一个进程外服务器。我已经到了可以CoCreateInstance()从客户端调用的地步,EXE 启动,注册它的工厂,工厂创建组件的实例。CoCreateInstance返回 S_OK 并且客户端接收到一个不为 NULL 的接口指针。

当我调用接口的方法时会出现问题。

  • 首先,方法中的断点没有被命中(是的,在另一个进程中,不过我也在调试服务器。服务器中的其他断点被命中ok)。
  • 第二,客户报告Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

我绝对知道 COM 接口中的方法必须使用__stdcall,并且我已经检查了好几次它没有丢失。此外,组件(C++)的实现源自 MIDL 生成的接口。所以接口的头文件有正确的调用约定,如果组件的头文件没有,编译器会抱怨覆盖不同。

由于断点甚至没有被命中,我的直觉是本地过程调用存在根本性错误,就像未正确设置 vtbl 一样。有没有人建议什么可能导致观察到的行为?关于如何调试代理/存根代码的任何提示?

编辑:

作为对 WhozCraig 的回应,这里是 IDL 文件:

import "unknwn.idl";

// Interface IMyApp1
[
   object,
   uuid(440EA043-DF6D-4df9-963D-7660BBA829EF),
   helpstring("IMyApp1 Interface"),
   pointer_default(unique)
]

interface IMyApp1: IUnknown
{
   HRESULT ShowAboutBox(void);
}
4

1 回答 1

1

我发现了问题。这是一个相当尴尬的错误,但有趣的是知道它会导致观察到的效果,所以我会在这里发布它以防其他人遇到同样的问题。

客户在做

HdResult = CoCreateInstance(
   sClassIdApp,
   NULL,
   CLSCTX_LOCAL_SERVER,
   IID_IUnknown,   // Oops...
   (void**) &pInterface);

pInterface->ShowAboutBox();

代替

HdResult = CoCreateInstance(
   sClassIdApp,
   NULL,
   CLSCTX_LOCAL_SERVER,
   IID_IMyApp1,
   (void**) &pInterface);

pInterface->ShowAboutBox();

呃...

于 2012-10-30T22:18:55.697 回答