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

如何从VC+;调用COM DLL的函数(在VC+;+;)+。EXE应用程序?,com,visual-c++,Com,Visual C++,我有一个用VC++编写的COM DLL(比如xyz.DLL)。我想创建一个调用EXE应用程序(calling.EXE),它将调用COM DLL(xyz.DLL)的函数 我按照链接中的步骤操作。 但我无法连接DLL和EXE,因此无法调用COM DLL的函数。我对COM和VC++编程一无所知。谁能帮我一下吗 我正在使用VisualStudio2005 这些正是我遵循的步骤----- 步骤1:创建了一个包含DLL项目(xyz.DLL)项目和模板MFC应用程序(基于对话框)的调用方应用程序项目(call

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

我按照链接中的步骤操作。 但我无法连接DLL和EXE,因此无法调用COM DLL的函数。我对COM和VC++编程一无所知。谁能帮我一下吗

我正在使用VisualStudio2005

这些正是我遵循的步骤-----

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

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

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

步骤4:右键单击calling.exe应用程序项目属性-->公共属性-->引用-->添加了对DLL的引用。

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

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

就这些声明

Cx objname; objname.func()

这里Cx是DLL中类的名称

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


提前谢谢

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

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

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

regsvr32 "c:\..\..\xyz.dll" ; insert the correct path
然后向项目的stdafx.h添加一个#import指令,其中包含DLL的路径

#import "c:\..\..\xyz.dll" // insert the correct path
在文件视图中右键单击stdafx.cpp,然后选择编译。 这将生成访问DLL所需的包装器“智能指针”类。 智能指针类与DLL中的接口具有相同的名称,但末尾带有“Ptr”

查看扩展名为.tlh且与调试目录中的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());
}
然后,您可以像使用普通指针一样继续使用它。
但是,在完成后您不会删除它,当它超出范围时,它将自动销毁。

将您的#导入放在stdafx.h中所有其他标题之前。嗨,martin非常感谢您的帮助。我成功地从我的控制台VC++应用程序中调用了DLL的函数,方法是按照您给出的步骤进行操作……不客气。如果您满意,请接受我的答案(单击旁边的勾号)。在调试(使用F11)calling.exe应用程序时,当我进入函数调用语句时,头文件“comip.h”中出现错误。我得到错误的确切位置是Interface*operator->()const{if(m_pInterface==NULL){{u com_issue_error(E_POINTER);}return m_pInterface;}错误在窗口中弹出,因为------当前位置没有可用的源代码。你想看拆解吗。你能帮忙吗..我应该使用CoInitialze(NULL)使用_转换等?我的怀疑可能看起来很愚蠢,因为我对COM编程一无所知。请引导我。我不知道为什么我不能调试它,并在“comip.h”头文件中得到错误。先谢谢你。。。