step1.项目创建
step2.添加外部调用方法
1.打开类视图,找到下面这个图标,项目名称的这个文件点击右键,添加方法
2.如果需要字符串参数,请选择BSTR类型,点击添加,确定,如下图
3.第二部操作在DhCameraCtrl类中除了添加了test方法的声明和实现,还有以下变化
下图是DhCamera.idl文件,这里面添加的方法都是虚函数,微软通过内部的封装,在DhCameraCtrl类中进行了实现
在第三步可以看到我们在添加方法的时候选择的参数类型是BSTR,在声明和实现中却是LPCTSTR,我也不明白
step3.网页方法测试
<span style="font-size:18px;"><html>
<body>
<div class="section">
<div class="container">
<div class="content">
<input type="button" οnclick="clickActive()" value="click">
<div id="f_ocx" style="top:60px; left:0; width: 963px; height: 631px;">
<!--classid step2中第三步标注的CLSID,注意不能丢掉CLSID-->
<object id="MfcActivex" width="100%" height="100%" classid="CLSID:A906CABE-B037-4EAC-97FE-2BCBDD0C3CE5"></object>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function clickActive() {
var MR = document.getElementById("MfcActivex")
if (null == MR){
alert("控件加载失败")
}else {
var ret = MR.Login();
alert(ret)
}
}
</script>
</body>
</html></span>
step4.显示MFC页面
1.DhCameraCtrl.h 中添加 #include"DhCameraPropPage.h"
2.CDhCameraCtrl类声明中添加
public:
CDhCameraPropPage m_mainDlg;
3.修改绘图函数
void CDhCameraCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */)
{
if (!pdc)
return;
// TODO: 用您自己的绘图代码替换下面的代码。
//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
//pdc->Ellipse(rcBounds);
m_mainDlg.MoveWindow(rcBounds, TRUE);
}
4.添加WM_CREATE消息响应函数:项目->类向导,如下图
5.生成OnCreate方法后,添加实现
int CDhCameraCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
m_mainDlg.Create(IDD_PROPPAGE_DHCAMERA, this);
m_mainDlg.ShowWindow(SW_SHOW);
return 0;
}
PS:
1.生成的OCX需要进行注册
以管理员方式启动DOS.EXE,执行下列命令(regsvr32 路径+文件名),此操作将CLSID注册到注册表
regsvr32 E:\C++Workspace\DhCamera\Debug\DhCamera.ocx
regsvr32 E:\C++Workspace\DhCamera\Debug\DhCamera.ocx -u (取消注册)
2.测试过程中出现控件的MFC界面之前可以显示,后来无法显示,究其原因是连接不到第三方库,如果没有用第三方库就不必理会了
3.添加新的外部方法会添加四处代码,修改外部调用方法也需要修改这四个地方
1)2)声明与定义
3)CDhNetCameraCtrl.cpp
// 调度映射
BEGIN_DISPATCH_MAP(CDhNetCameraCtrl, COleControl)
4).ild文件外部接口