我正在执行一个EXE文件中的COM服务器的过程。 准确地说,我将COM接口添加到现有的应用程序。 最终目标是实现应用程序的自动化。
第一个组件和一个接口(迄今为止只有一个方法)基本就位。 我可以在DLL中构build一个in-proc服务器,并成功获取接口指针并调用该方法。 这只是第一步,因为我只是在学习。 以后我不需要DLL; 它只是作为概念certificate,我的组件和接口基本上是好的。
然后,我在EXE中build立了一个进程外的服务器。 我已经到了可以从客户端调用CoCreateInstance()
的地步,并且EXE已经启动,注册了它的工厂,工厂创build了一个组件实例。 CoCreateInstance
返回S_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.
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();
咄…