从 MFC 调用 ATL COM dll

Posted

技术标签:

【中文标题】从 MFC 调用 ATL COM dll【英文标题】:Calling ATL COM dll from MFC 【发布时间】:2013-09-08 22:33:21 【问题描述】:

我使用 VS2012 编写了一个 com dll。我有 2 个项目——我的 DLL 项目和一个 PS 项目。 PS有3个类: myproj_i.h myProj_i.c myProj_p.c

现在我想从另一个 MFC 项目中调用 dll:

hr = CoCreateInstance( CLSID_MYTASK, NULL, CLSCTX_INPROC_SERVER, IID_IMYTASK, (void**) &pMYTASK );

我已包含 myproj_i.h 文件 - 所以我可以识别所有符号,但我无法链接它们,因为我缺少 _i.c 文件。

如果我将它们添加到项目中,我会遇到大量 PCH 错误。

我应该如何链接我的 MFC 项目并调用 DLL?

我也尝试过使用 dll 的#import,但后来我得到了缺少 TLH 错误,并且我在 DLL 项目中没有找到该文件。

包含 myProjPS.lib 也没有解决...

【问题讨论】:

特定编组场景需要 PS 项目,很有可能您根本不需要它。如果你这样做了,也许值得更好地解释最终目标。最简单的包含是使用#import,看看there - code snippet。 我尝试导入,但在查找我没有的 .tlh 文件时出现错误...我可能不需要它,它就在那里,所以我使用了它。我在 mfc 和 atl dll 之间传递字符串和 long,仅此而已。 【参考方案1】:

MIDL 生成的 .c 文件不使用预编译头文件。如果您将它们链接到您的程序中(我通常为它们制作静态库,但这是一种不同的方法),您需要关闭这些特定 .c 文件的预编译头文件。

右键单击解决方案资源管理器中的 myProj_i.c 文件并调出其属性。 在前两个下拉列表中选择所有平台/所有配置。 在左侧树中展开 C++ 设置。 在左侧树中选择预编译头文件 为该文件关闭它们。

这应该允许它成功编译和链接。

【讨论】:

所以我需要将 .c 文件添加到我的 mfc 项目中并在那里编译它们?每次重新生成它们时,只需替换它们并重复此过程? 尝试了你的解决方案,它让我前进了一点,但现在我得到了 7 个未解析的符号 - 虽然不是我的……:未解析的外部符号 _IUnknown_QueryInterface_Proxy@12、_IUnknown_AddRef_Proxy@4 等等……什么我现在失踪了吗? 好的! - 不包括 _p.c - 只有 _i.c 没关系!! @Dani 正确。 _p.c 文件是代理/存根代码。对于您需要的(IID 和 CLSID),您不应该需要它。 (假设这是一个客户端而不是实际的服务器)

以上是关于从 MFC 调用 ATL COM dll的主要内容,如果未能解决你的问题,请参考以下文章

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

WTL强制资源从非mfc应用程序中的dll加载的方式? (我们使用的是 WTL/ATL,不是直接的 win32)

ATL(COM) 开发下 -- VS2010

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

ATL COM dll 中的缓冲区溢出

关于COM组件调用