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

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

第一个组件和一个接口(迄今为止只有一个方法)基本就位。 我可以在DLL中构build一个in-proc服务器,并成功获取接口指针并调用该方法。 这只是第一步,因为我只是在学习。 以后我不需要DLL; 它只是作为概念certificate,我的组件和接口基本上是好的。

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

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

  • 首先,方法中的断点没有被触发(是的,它在另一个进程中,但是我也在debugging服务器,服务器中的其他断点是正常的)。
  • 其次,客户端报告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. 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的线路没有正确设置。 有没有人有build议可能导致观察到的行为? 有关如何debugging代理/存根代码的任何提示?

编辑:

为了响应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); } 

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

客户正在做

 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(); 

咄…