首页 文章

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

提问于
浏览
7

我有一个用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 .

These are the exact steps I followed--------

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

STEP 2: 右键单击解决方案资源管理器中的calling.exe项目,直到属性 . Configuration properties --> C/C++ --> General--> Additional Include Directivesadded the path to the DLL Project..

Step 3: 再次右键单击calling.exe应用程序项目转到 Properties--> Configuration properties --> Linker --> Input --> Additional Dependenciesadded the path to the .Lib file for the built DLL Project.

STEP 4: Right click on calling.exe application ProjectProperties --> Common Properties --> References --> Added reference to the DLL.

STEP 5: Copied the xyz.dll file to the application project directory.

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

只是声明

Cx objname; objname.func();

这里Cx是DLL中类的名称 .

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

提前致谢 .

1 回答

  • 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,然后选择 compile . 这将生成访问DLL所需的包装"smart pointer"类 . 智能指针类与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());
    }
    

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

相关问题