关于控件注册与取消注册的两种方法:
第一种: 使用MVS程序编写OCX控件的时候以管理员权限运行,并且打开注册输出,如下图:
第二种: 不以管理员身份运行的话,要关闭注册输出,否则会无法生成解决方案。生成的OCX控件在使用的时候需要通过bat脚本命令文件注册。注销也是一样。具体的bat指令如下图所示:
bat指令如果有什么不懂自行百度。
网页调用OCX控件方法:
HTML代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>OCX测试例程</title>
</head>
<body>
<form name="form1">
<p>
返回信息:<br/>
<textarea type="text" name="pOutInfo" size="60" style="width: 600px;height:124px" cols="20" rows="1"/></textarea>
<br/>
<p><input type="button" onclick="Clear()" value="清空信息" /> </p>
</p>
<p><input type="button" value="获取卡号数据并显示在网页上面" id="btnOK_card" onclick="GET_IDCARD();"></input> </p>
</form>
<object classid="clsid:26A9189F-A696-457F-9F31-54B2D3B06BD9"id="test"
CODEBASE="MFC_OCX.ocx#version=1.0"
width="0" height="0">
</object>
</body>
<script language="javascript" type="text/javascript">
var myform = document.form1;
function GET_IDCARD()
{
var ret;
var SIDbuff;
var pOutInfo_11;
ret=test.Show_Test();
if (ret < 0) {
myform.pOutInfo.value = "返回错误码:" + ret;
}
else {
SIDbuff=test.req_data;
myform.pOutInfo.value = "获取卡号数据成功:"+SIDbuff;
}
}
function Clear() //清空信息
{
myform.pOutInfo.value = "";
}
</script>
</html>
下面是这段代码的一些讲解:
首先呢,控件在Object标签里面进行调用,通过OCX控件生成时就固有的CLASSID去调用对应的控件,具体可以在OCX控件的IDL文件中查看,具体如下图CMFC_OCXCtrl类信息,每个控件都是有一定的样式,这里的HTML设置的控件的样式是宽高都是0,即是不显示控件的样式,但是还是可以正常使用控件方法中的样式属性等。值得一提的一点是,CLASSBASE,这个关键字指定的是OCX加载的路径,这里指定的是当前目录下,也可以指定在公网下载OCX控件,具体请自行百度查阅。
这段HTML文件的执行流程是:
点击网页的按钮,执行对应的按钮响应函数,在按钮响应函数中调用OCX控件的方法,去进行相应的操作。这时会碰到一个问题,就是控件中的方法中的结果如果传到网页中呢?
网页调用OCX方法的传参问题:
这里只是其中的一个方法,仅供参考,其他方法请自行百度
传参问题:在编写OCX控件的时候,设定属性值控件的方法在执行之后获得的值,直接赋值给属性值,网页在成功调用OCX控件之后,可以直接类似于类成员或是结构体成员一样去使用控件的属性值,因为本质上,属性就是类的成员。之后的图片中会指出哪个变量是属性值,以便没有接触过的朋友了解。
MVS程序编写OCX控件:
在MVS程序上面编写OCX控件主要是修改如图三个文件
图中的中间这个头文件是供外界使用的控件的方法或是属性是的声明。
这里值得一提的是enum枚举变量的声明,添加一个方法之后就会生成一个枚举变量,这里的枚举变量生成可能会有问题,出现错误,如果出现错误,照着这个样式改过来。不知道具体的影响是什么,MVS就是自动生成错了这个枚举变量。
其中最后的一个变量Cstring变量是属性值。属性值的前一个是生成属性值一起生成的方法。前面第二个是添加的方法,可供外界使用。我是在这个供外界使用的方法中通过给属性值赋值的,网页直接调用属性值变量的方法把OCX控件的运算结果(想当于是返回值)传递出去。
关于属性值的一个问题:
属性值具体的设置方法请自行查阅,或是我再下一篇文章中介绍一下,这里只是提一下属性值的持久性支持,这个在MFC_OCXCtrl.cpp文件中进行设置,具体的函数已经自动生成,只要添加需要保持持久性的属性值。
// CMFC_OCXCtrl::DoPropExchange - 持久性支持
void CMFC_OCXCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: 为每个持久的自定义属性调用 PX_ 函数。
PX_String(pPX, "req_data", m_req_data, "0");
}