VS2017使用ocx封装dll
前言
本文的主要任务是使用IE11访问被ocx封装的dll,开发平台是win10 64位。
整体环节分为如下几步:
1、写一个return a+b的简单dll;
2、使用ocx封装dll;
3、注册ocx;
4、IE11调用ocx;
本文开发的dll、ocx均是32位。IE11有两个进程,分别是x86、x64的,IE11调用64位的ocx很麻烦,所以我写的是32位的ocx。
由于在此次任务中,我踩了许多坑,同时也收获了很多,所以写了这篇博客,以供后来者借鉴。
一、dll代码
一、dll项目的创建
点击【新建】,【项目】,弹出如下界面,选择DLL,点击确定即可。
二、dll代码
1、新建Dll1.h头文件
#pragma once
double Add(double a, double b);
int Multi(int a, int b);
int Sys();
2、新建Dll1.cpp文件
#include "Dll1.h"
#include "pch.h"
double Add(double a, double b) {
return a + b;
}
int Multi(int a, int b) {
return a * b;
}
int Sys() {
return 100;
}
pch.h是我创建Dll1项目就有的,如下图所示:
3、点击源文件,点击【添加】,【新建项】,弹出如下界面,选择.def文件,点击添加即可
4、Source.def
LIBRARY Dll1
EXPORTS
Add @1
Multi @2
Sys @3
5、右键点击项目Dll1属性,在如下界面里,模块定义文件中写入“Source.def”。
6、选择32位,把两个平台改成Win32就行。接下来右键项目Dll1,点击生成。
7、测试
用dumpbin工具查看现在dll导出的函数
左键点击win10开始界面,往下扒拉,找到形似visul studio 2017的文件夹,点击它,再点击x64_x86交叉工具命令提示符,输入
dumpbin -exports dll文件的绝对路径
就可以看到dll文件有哪些函数被导出。
二、ocx封装dll
1、ocx项目的创建
点击【新建】,【项目】,弹出如下界面,选择ActiveX,点击确定即可。接下来直接点击完成
2、代码
1、点击类视图,如下所示,然后右键点击它,点击添加,方法属性都可以添加
2、方法添加完之后,MFCActiveXControl1.idl、MFCActiveXControl1Ctrl.h、MFCActiveXControl1Ctrl.cpp要记得保存
3、点击MFCActiveXControl1Ctrl.cpp,在刚添加的Add方法写代码
DOUBLE CMFCActiveXControl8Ctrl::Add(DOUBLE a, DOUBLE b)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此处添加分派处理程序代码
typedef DOUBLE(*Add)(DOUBLE, DOUBLE);
HINSTANCE hDll;
Add add;
hDll = LoadLibrary(_T("G:\\visual-studio-source\\repos\\Dll2\\Debug\\Dll2.dll"));
double res = 1.0;
if (hDll != NULL)
{
add = (Add)GetProcAddress(hDll, "Add"); //获得DLL中函数的入口地址
if (add != NULL)
{
res = add(a, b);
}
else {
res = 0.1 + GetLastError();
}
}
else {
res = 0.2 + GetLastError();
}
FreeLibrary(hDll);
return res;
}
3、在【解决方案资源管理器】中,右键点击【MFCActiveXControl1】、【属性】、【常规】、【注册输出】项,选择【否】。注意【属性页】的平台选择和【编译器】选择一致。
4、在【解决方案资源管理器】中,右键点击【MFCActiveXControl1】、【生成】,即可生成OXC文件。
5、测试工具
这个工具是查看ocx的CLSID和方法、属性
链接:https://pan.baidu.com/s/1swbNiG7jOvILc1a7XOIJbw
提取码:nbsp
这个工具是测试ocx的方法,不过这个ocx必须已经注册
链接:https://pan.baidu.com/s/1qg1iDd5vvbQ12TWyL9dYnw
提取码:nbsp
三、注册
百度解决
四、IE11调用
将注册好的ocx放到idea的webapp目录下,在调用页面添加代
<OBJECT ID="mfc" CLASSID="CLSID:d16a4401-286d-4918-a0e8-58221cf4f708"
codebase="./MFCActiveXControl1.ocx"></OBJECT>
然后使用js获取object标签对象,调用方法即可。