分类: Windows平台
2013-11-26 17:20:48
Activex是com组件的一种,取代ole的一部分。据说是microsoft和sun公司对抗出来的产物,但是无从查证。
一、如何创建activex控件
1.创建工程
File / New / Projects / MFC ActiveX ControlWizard,工程名称输入OnlineOcx(自定义)。
点击OK进入下一画面,“Would you like help files to be generated?”选择“No help files”。
点击Next进入下一画面,点击Finish完成。
ClassView中的结构如图:
2 添加自定义的方法
在ClassView中点选工程名称,CTRL+W启动ClassWizard,或者File/ClassWizard启动ClassWizard,选择Automation分页,如下图:
在该页面中可以添加方法或属性。
在External name中输入方法名,编译器自动添加到Internal name中,其他选项的填写方式参考图片,Parammeter list中的Type可以在下拉列表中选择。点击OK完成添加,新增的方法名称显示在External names中,如图:
点击OK完成。
编译器自动添加的内容如下:
OnlineOcxCtl.h文件中:
//{{AFX_DISPATCH(COnlineOcxCtrl)
afx_msg long testFunc(short FAR* cParam1, short FAR* cParam2, long FAR* total, long FAR* arr);
//}}AFX_DISPATCH
//{{AFX_DISP_ID(COnlineOcxCtrl)
dispidTestFunc = 1L,
//}}AFX_DISP_ID
OnlineOcxCtl.cpp文件中:
BEGIN_DISPATCH_MAP(COnlineOcxCtrl, COleControl)
//{{AFX_DISPATCH_MAP(COnlineOcxCtrl)
DISP_FUNCTION(COnlineOcxCtrl, "testFunc", testFunc, VT_I4, VTS_PI2 VTS_PI2 VTS_PI4 VTS_PI4)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(COnlineOcxCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
// 下面即为函数体,可以填写要实现的内容
long COnlineOcxCtrl::testFunc(short FAR* cParam1, short FAR* cParam2, long FAR* total, long FAR* arr)
{
// TODO: Add your dispatch handler code here
return 0;
}
// 添加代码如下所示,在调用该函数时可用来验证
long COnlineOcxCtrl::testFunc(short FAR* cParam1, short FAR* cParam2, long FAR* total, long FAR* arr)
{
// TODO: Add your dispatch handler code here
//////////////////////////////////////////////////////////////////////////
CString szTmp = _T("");
szTmp.Format("cParam1=%s, cParam2=%s", cParam1, cParam2);
AfxMessageBox(szTmp);
*total = 123;
for (int i=0; i<10; i++)
{
arr[i] = (i+1)*(i+1);
}
//////////////////////////////////////////////////////////////////////////
return 0;
}
添加一个属性的话,会生成一个On***函数,同时生成一个Set***控件接口。即,使用控件的程序使用Set***的话,控件会用On***函数去响应这个事件。
3 编译
编译工程,编译器自动注册ocx。生成的ocx控件可以通过VC自带的工具测试:「开始」菜单\程序\Microsoft Visual C++ 6.0\Microsoft Visual C++ 6.0 Tools\ActiveX Control Test Container
二、VC程序如何调用activex
1.首次使用ocx,用命令regsvr32 ocx文件路径,注册ocx
2.菜单Project / Add to Project / Components and Controls 打开如下窗口:
选择目录“Registered ActiveX Controls”,刚刚编译生成的OnlineOcx已经在列表中了,如图:
3.添加组件
新建一个基于窗体的Exe工程,在窗体上点击右键/Insert ActiveX Control,打开一个窗口,选择OnlineOcx控件:
int iReturn = (int)m_myOcx.testFunc((short *)cParam1, (short *)cParam2, (long *)&total, (long*)iArr);
}
设置断点,调试运行,先弹出如下窗口:
注意事项:
a.在建立了测试工程后,若需要修改ocx的工程,编译时会提示文件被占用,把测试工程关掉,稍等几秒即可。
b. 删除ocx,删除导入的h、cpp文件,和工程文件*.dsw、*.clw。