如何从VC ++ .EXE应用程序调用COM DLL的函数(在VC ++中)?

时间:2010-10-24 12:16:16

标签: com visual-c++

我有一个用VC ++编码的COM DLL(比方说,xyz.dll)。我想创建一个调用EXE应用程序(calling.exe),它将调用COM DLL(xyz.dll)的函数。

我按照链接http://www.codeproject.com/kb/DLL/XDllPt1.aspx中的步骤操作。 但我无法连接DLL和EXE,因此无法调用COM DLL的功能。我是COM和VC ++编程的新手。任何人都可以帮助我。

我正在使用Visual Studio 2005。

这些是我遵循的确切步骤--------

第1步:创建了一个包含DLL项目(xyz.dll)项目和模板MFC应用程序(基于对话框)的调用者应用程序Project(calling.exe)的解决方案。将此calling.exe作为启动项目..

第2步:右键单击解决方案资源管理器中的calling.exe项目,找到属性。 配置属性 - > C / C ++ - >通用 - >其他包含指令添加了DLL项目的路径..

第3步:再次右键单击calling.exe应用程序项目转到属性 - >配置属性 - >链接器 - >输入 - >其他依赖项为已构建的DLL项目添加了.Lib文件的路径。

第4步: 右键单击“调用应用程序项目”属性 - >共同属性 - >参考文献 - >添加了对DLL的引用。

第5步: 将xyz.dll文件复制到应用程序项目目录。

第6步:我的DLL有许多头文件及其相应的源文件。因此,将DLL项目中存在的所有头文件添加到我的calling.exe应用程序中。在calling.exe应用程序的一个.CPP程序中出现的OnInitDialog()函数中,我调用了DLL的函数。

只是陈述

Cx objname; objname.func();

这里Cx是DLL中类的名称。

我没有对EXISTING DLL项目的配置设置进行任何更改,因为它是已经由专家准备的DLL,我只编写调用applaction来调用此DLL中的函数。

感谢提前。

1 个答案:

答案 0 :(得分:10)

您遵循的说明是调用普通DLL中的函数,而不是COM DLL。要访问COM DLL,您需要通过COM。

您没有链接到DLL的lib文件或包含任何标题,也不需要移动DLL。

首先,确保通过在其上运行regsvr32来注册DLL。

regsvr32 "c:\..\..\xyz.dll" ; insert the correct path

然后将#import指令添加到项目的stdafx.h中,其中包含DLL的路径。

#import "c:\..\..\xyz.dll" // insert the correct path

右键单击文件视图中的stdafx.cpp,然后选择编译。 这将生成访问DLL所需的包装器“智能指针”类。 智能指针类与DLL中的接口具有相同的名称,但最后使用“Ptr”。

查看扩展名为.tlh且与Debug目录中的DLL名称相同的文件。它以C ++名称空间声明开头。 这是您要从DLL创建的对象所在的命名空间。

假设名称空间是 XYZ ,并且您希望实例化 Cx 对象,该对象公开 Ix 接口。 你会这样做:

try {
    XYZ::IxPtr obj;
    obj.CreateInstance(__uuidof(XYZ::Cx));
    obj->func();
} catch (_com_error e) {
    printf("Error: %S\n", e.Description());
    printf("Error: %S\n", e.ErrorMessage());
}

然后,您可以像普通指针一样继续使用它。 完成后不会删除它,当它超出范围时会自动销毁。