我正在 EXE 文件中实现 COM 服务器。准确地说,我正在向现有应用程序添加 COM 接口(interface)。最终目标是使应用程序自动化。
第一个组件和一个接口(interface)(目前只有一个方法)基本就位。我可以在 DLL 中构建进程内服务器并成功获取接口(interface)指针并调用该方法。这是第一步,因为我只是在学习。我以后不需要 DLL;它只是作为概念证明,我的组件和接口(interface)基本上没问题。
然后我在 EXE 中构建了一个进程外服务器。我已经到了可以从客户端调用 CoCreateInstance() 的地步,然后启动 EXE,注册其工厂,然后工厂创建组件的实例。 CoCreateInstance 返回 S_OK,客户端收到一个非 NULL 的接口(interface)指针。
调用接口(interface)的方法时出现问题。
Run-Time Check
故障 #0 - ESP 的值没有正确保存在
函数调用。这通常是调用函数的结果
用一个调用约定声明,声明一个函数指针
使用不同的调用约定。。我完全知道 COM 接口(interface)中的方法必须使用 __stdcall,而且我已经多次检查它没有丢失。此外,组件(C++)的实现源自 MIDL 生成的接口(interface)。因此接口(interface)的头文件具有正确的调用约定,如果组件的头文件没有,编译器会提示覆盖不同。
由于甚至没有命中断点,我的直觉是本地过程调用存在根本性错误,就像 vtbl 未正确设置一样。有没有人建议什么可能导致观察到的行为?关于如何调试代理/ stub 代码的任何提示?
编辑:
为了回应 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();
呃...
关于windows - COM 服务器 : ESP not saved across a function call when calling interface method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128199/