从 MFC 客户端调用 VB ActiveX DLL






4.63/5 (25投票s)
2000年9月6日

556657

2596
一种从 VC/MFC 客户端调用 VB ActiveX DLL 的简单方法
引言
在本文中,我将介绍一种从 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 的名称是 _clsdll
。 CoCreateInstance
函数返回请求的接口指针的地址。 现在可以愉快地使用指针 t 来访问服务器组件的功能。
就这样。 单击按钮时,应该会弹出一个消息框。