65.9K
CodeProject 正在变化。 阅读更多。
Home

从 MFC 客户端调用 VB ActiveX DLL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (25投票s)

2000年9月6日

viewsIcon

556657

downloadIcon

2596

一种从 VC/MFC 客户端调用 VB ActiveX DLL 的简单方法

  • 下载源文件 - 30 Kb
  • 引言

    在本文中,我将介绍一种从 MFC 客户端应用程序调用 VB ActiveX DLL 的方法。 有其他方法可以做到这一点,但我发现这是迄今为止最简单的方法。 此处提供的任何信息仅用于学习目的。

    我将简要指出您需要遵循的步骤 -

    • 使用 VB 创建 ActiveX 服务器组件。 这是您需要使用 VB 创建的 ActiveX DLL。
    • 使用 MFC Appwizard 创建一个基于对话框的 MFC 应用程序。
    • 将服务器(DLL)的类型库导入到 MFC 客户端应用程序中。
    • 初始化 COM 库
    • 检索服务器组件的 CLSID。
    • 创建 COM 服务器组件的实例。
    • 使用 COM 对象
    • 取消初始化 COM 库

    首先使用 VB 6.0 创建一个新的 ActiveX DLL 项目。 将项目命名为prjdll,将类命名为clsdll。 向类中添加一个新函数fnCallDll。 我的函数只是显示一个消息框,如下所示

    Public Function fnCallDll()
    	MsgBox "VB ActiveX DLL"
    End Function
    

    保存并编译此项目以创建 prjdll.dll。 这是我们的服务器组件。

    现在我们将开发客户端。 使用 MFC Appwizard 在 VC++ 中创建一个新的基于对话框的应用程序,并保存项目。

    我们将使用 #import 语句导入服务器组件的类型库。 将 prjdll.dll 文件复制到您保存 MFC Appwizard 项目的目录中。 单击Project Workspace窗口的FileView选项卡,展开Header Files文件夹,打开文件stdafx.h并添加以下代码(显示为灰色)

    # import "prjdll.dll"
    using namespace prjdll; 

    必须之后添加上面的代码

    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately  
    

    之前

    #endif 

    在 stdafx.h 文件中。导入 prjdll.dll 文件有助于编译器在运行时链接到 dll 的类型库。 #import 告诉编译器生成包装器类,该类将封装服务器组件的功能。 如果服务器组件是使用 VB 创建的,我们需要导入关联的 .dll 文件;如果组件是使用 VC++ 创建的,我们需要导入 .tlb 文件。默认情况下,包装器类的名称将与服务器组件名称相同。

    编译 stdafx.cpp 文件。 编译器会在项目的 Debug 或 Release 目录中生成一个 .tlh 和一个 .tli 文件(具体取决于您的配置)。 这些是类型库头文件和实现文件。 双击打开 .tlh 文件,并找到紧跟在单词 namespace 之后的单词。 这通常是我们之前使用 VB 创建的项目的名称。查看我们之前插入到 stdafx.h 文件中的代码。需要 using namespace,以便我们可以访问服务器的方法。

    在对话框上放置一个 codebutton 控件 (IDC_BUTTON1)。 双击控件以添加按钮的命令处理程序 OnButton1()。 现在在处理程序中添加以下代码 -

    HRESULT hresult;
    CLSID clsid;
    
    CoInitialize(NULL);	//initialize COM library
    hresult=CLSIDFromProgID(OLESTR("prjdll.clsdll"), &clsid);    //retrieve CLSID of component
    		
    _clsdll *t; 
    hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsdll),(LPVOID *) &t);
    if(FAILED(hresult))
    {
    	AfxMessageBox("Creation Failed");
    	return;
    }
    
    t->fnCallDll ();  //call method
    t->Release();   //call method
    CoUninitialize();  //Unintialize the COM library         
    

    CoClass 的名称是 _clsdllCoCreateInstance 函数返回请求的接口指针的地址。 现在可以愉快地使用指针 t 来访问服务器组件的功能。

    就这样。 单击按钮时,应该会弹出一个消息框。

    © . All rights reserved.