如何从 VisualC++6.0 可执行文件访问 VisualBasicActiveXDLL 本文介绍三种方法可以从 VisualC++6.0 访 VisualBasicActiveXDLL 执行 1. 创建 VisualBasicActiveXDLL 项目 默认情况下创建 Class 1 2. 以下代码添加到 Class 1: Public Function MyVBFunction(x As Integer) As Integer MsgBox x End Function 3. 编译 DLL 作为 c:\project1.dll 并退出 VisualBasic 方法 1 - CreateDispatch: 1. 启动 VisualC++ 并在文件菜单上选择新建 选择 MFC 应用程序向导 (Exe) 和项目名称和 Click 确定 出现 MFC 应用程序向导对话框, 时单击完成 在下一个对话框中单击确定 2. 在视图菜单上选择 ClassWizard, 在类名称框中, 选择 Ctst1App 并双击 InitInstance 消息中 单击编辑代码以对于 BOOL CTst1App::InitInstance() 调出代码 查找行 AfxEnableControlContainer();,: 并添加以下行之前 AfxOleInit(); 3. 从视图菜单中选择 ClassWizard 单击 Click AddClass 自动化选项卡并选择 " 从 TypeLibrary " 指定 Project 1.dll, VisualBasicDLL 是步骤 3 中创建它 当出现确认类对话框, 单击确定 单击确定以关闭 MFCClassWizard 对话框中再次 4. 打开 App 名 >.cpp 文件并添加行 # include " Project1.h " 您需要包括 Project1.h 只要您有访问 project1.dll 代码 5. 再次打开 ClassWizard 在消息映射选项卡, 选择 @ @ ClassName@@ @ 框和对象 ID 中, IDOK 中 CAboutDlg, 然后双击 BN _CLICKED 以响应对话框并确定以关闭 ClassWizard 再次单击确定
6. 打开 App 名 >.cpp 滚动到底部到 thecaboutdlg::onok(), 并替换为以下代码 : void CAboutDlg::OnOK() short st = 2; short st1; _Class1 p; p.createdispatch("project1.class1"); st1 = p.myvbfunction(&st); CDialog::OnOK(); 7. 编译.exe 文件 (7) 8. 运行.exe 文件并帮助菜单上选择有关 请确定单击关于框上并出现消息框 project1.dll 中指定 单击关闭按钮以关闭对话框 方法 2 - #IMPORT: 1. 启动 VisualC++6.0 并创建 Win32 控制台应用程序 选择 " An 空项目 " 并单击完成 2. 指向项目菜单上, 单击新建将新 C++ 源文件添加到项目上添加到项目 将以下代码粘贴到新源文件并保存 : #include <stdio.h> // This is the path for your DLL. // Make sure that you specify the exact path. #import "c:\project1.dll" no_namespace void main()
BSTR bstrdesc; Try CoInitialize(NULL); short st = 2; short st1; // Declare the Interface Pointer for your Visual Basic object. Here, // _Class1Ptr is the Smart pointer wrapper class representing the // default interface of the Visual Basic object. _Class1Ptr ptr; here // Create an instance of your Visual Basic object, // uuidof(class1) gets the CLSID of your Visual Basic object. ptr.createinstance( uuidof(class1)); st1 = ptr->myvbfunction(&st); catch(_com_error &e) bstrdesc = e.description(); CoUninitialize();
3. 编译并运行项目 应该从 Project1.DLL 消息框 MFC 或 Win 32 应用程序, 控制台应用程序, 中也可以使用 # import 方法 方法 3 - 纯 COM 接口 1. 启动 VisualC++ 并从文件菜单选择新建 选择 MFC 应用程序向导 (Exe), 项目 tst1, 名称并单击确定 出现 MFC Appwizard 对话框时, 选择对话框基于然后单击完成 出现下对话框时单击确定 2. 默认启动资源编辑器 删除对话框上所有控件并, 上添加命令按钮保留默认标题 " Button 1 " 3. 双击 Button 1 以显示对话框添加成员函数 单击确定以接受 OnButton1 名称 4. 单击工具菜单上 OLE/COM 对象查看器 从文件菜单上选择视图 Typelib 并选择前面创建 Project 1.dll 单击打开以显示 ITypeLib 播放器, 其中包含对您的 DLL.idl 文件 5. 将.idl 文件 ( 内容 ) 的右窗格的内容复制到剪贴板 页面或滚动到末尾窗格中文本从首字符时按住 SHIFT 键 按 Ctrl+C 将标记文本复制到剪贴板 6. 单击 VisualC++ 菜单上的新建 选择文本文件新对话框, 文件 test1.idl, 名称上, 单击确定 件 7. 出现一个空文本文件将数据从剪贴板粘贴到它并保存文 8. 从项目菜单中选择设置, 展开 tst1 和 SourceFiles 节点的树视图, 然后选择 test1.idl 单击 MIDL 选项卡, 在输出头 " 文件名 " 框中, 输入 test1.h 然后单击确定 9. 打开 tst1dlg.cpp 并添加到下列文件 : 包括节 #include <initguid.h> #include "test1.h"
10. 单击 ClassWizard 在视图菜单上, 在 @ @ @ ClassName@@ @ 框, 选择 Ctst1App 并双击 InitInstance 中消息 单击编辑代码以弹出用于代码 : B00L CTst1App::InitInstance() 查找行 : AfxEnableControl Container(); 添加以下行之前 : AfxOleInit(); 11. 再次打开 ClassWizard 在消息映射选项卡选择 CTst1Dlg 和 IDC_BUTTON1 对象 ID 中 @ @ ClassName@@ @ 框中 双击 BN _ CLICKED 消息中, 然后单击编辑代码, 代码为 void CTst1Dlg::OnButton1() 弹出 用以下代码替换 OnButton1() 函数 : void CTst1Dlg::OnButton1() here. // TODO: Add your control notification handler code _Class1 *pclass = NULL; IUnknown *punk = NULL; // HRESULT hr = CoCreateInstance(CLSID_Class1,NULL, // CLSCTX_INPROC_SERVER,IID Class1,(void **)&pclass); // You can directly get the Interface ID as in the previous line or IID // you can do a QueryInterface on IUnknown to get the // as in the following three lines: HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,CLSCTX_INPROC_SER VER,
IID_IUnknown,(void **)&punk); hr = punk->queryinterface(iid Class1,(void **)&pclass); punk->release(); // Once you have the IID, you can make use of the interface pointer // to access our Visual Basic DLL. short st = 2; short st1; hr = pclass->myvbfunction(&st,&st1); pclass->release(); 12. 编译.exe 文件 (7) 并运行应用程序 (F5) 单击 Button 1 在对话框中 出现消息框从 VisualBasic DLL