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

cod*_*ver 7 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: 右键单击calling.exe应用程序项目, 属性 - >公共属性 - >引用 - >添加对DLL的引用.

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

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

只是声明

Cx对象; objname.func();

这里Cx是DLL中类的名称.

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

提前致谢.

Mar*_*rst 10

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

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

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

regsvr32 "c:\..\..\xyz.dll" ; insert the correct path
Run Code Online (Sandbox Code Playgroud)

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

#import "c:\..\..\xyz.dll" // insert the correct path
Run Code Online (Sandbox Code Playgroud)

右键单击文件视图中的stdafx.cpp,然后选择compile.这将生成访问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());
}
Run Code Online (Sandbox Code Playgroud)

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