COM服务器:调用接口方法时,ESP未在函数调用中保存

时间:2012-10-29 19:18:12

标签: windows com calling-convention stdcall out-of-process

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

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

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

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

  • 首先,方法中的断点未被击中(是的,它在另一个中 进程,但我也在调试服务器。其他断点 服务器点击确定。)
  • 其次,客户报告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);
}

1 个答案:

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

...咄