我正在EXE文件中实现COM服务器。准确地说,我正在向现有的应用程序中添加一个COM接口。最终目标是自动化应用程序。
第一个组件和一个接口(到目前为止只有一个方法)基本上已经就位。我可以在DLL中构建一个interface服务器,并成功地获得一个接口指针并调用该方法。这是作为第一步做的,因为我只是在学习。稍后我将不需要DLL;它只是作为概念的证明,即我的组件和接口基本上是正常的。
然后我在EXE中构建了一个进程外服务器。我已经到了可以从客户端调用CoCreateInstance()
的地步了,EXE已经启动,注册了它的工厂,并且工厂创建了组件的一个实例。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.
。我绝对知道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);
}
发布于 2012-10-30 14:18:55
我发现了问题。这是一个相当尴尬的错误,但有趣的是,它会导致观察到的效果,所以我会张贴在这里,以防其他人有同样的问题。
客户在做什么
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();
呃..。
https://stackoverflow.com/questions/13128199
复制相似问题