在 ATL COM dll 中调用了错误的方法

Posted

技术标签:

【中文标题】在 ATL COM dll 中调用了错误的方法【英文标题】:Wrong method called in ATL COM dll 【发布时间】:2012-03-10 12:57:51 【问题描述】:

我使用 ATL 创建了一个 COM dll。当我尝试在非托管 C++ 中使用它时,我发现缓冲区溢出。我目前正在使用一种名为 OnInitIDA() 的简单方法进行测试,我在其中所做的只是一个 cout 语句并返回。当我运行它时,返回的 HRESULT 将为 0,但它不会输出我期望的行。通过使用调试器的 step over 和 step into 函数,我发现调用它时并没有输入 OnInitIDA 的代码,而是进入了另一个名为 GetInclusionList 的方法。一旦我在这个方法中放置了一条语句,并且当应用程序运行时,这条线就会被打印出来。有谁知道为什么会调用错误的方法?

如果有帮助,我的代码已发布在这里:https://docs.google.com/open?id=0B3ehFEncKJH7ZDgxMGI1YjgtZTE2MS00ZTBkLWI2NzgtYzVhZjUxOWEzZGI0

【问题讨论】:

【参考方案1】:

这听起来像是您在构建客户端后更改了界面。

清理和重建所有项目是个好主意。

【讨论】:

【参考方案2】:

我找到了问题的答案。基本上,当我创建我的 dll 项目时,它继承自 IDispatch,但是我在测试应用程序中使用的接口希望它继承自 IUnknown。这意味着接口不匹配,IDispatch 继承自 IUnknown 并添加了许多方法。更改更改这些以匹配工作的 dll。

【讨论】:

以上是关于在 ATL COM dll 中调用了错误的方法的主要内容,如果未能解决你的问题,请参考以下文章

ATL COM DLL 寄存器错误 0x80070716

ATL COM dll 中的缓冲区溢出

非 MFC ATL 项目 (dll) 产生 MFC 相关错误

从 MFC 调用 ATL COM dll

旧 c 代码到 ATL/COM dll

ATL 结构在来自 dll 的 COM 对象上中断