运行环境:VC6.0
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;
}
3 编译
编译工程,编译器自动注册。
菜单Project / Add to Project / Components and Controls 打开如下窗口:
选择目录“Registered ActiveX Controls”,刚刚编译生成的OnlineOcx已经在列表中了,如图:
4 调用组件
新建一个基于窗体的Exe工程,在窗体上点击右键/Insert ActiveX Control,打开一个窗口,选择OnlineOcx控件:
点击OK,将控件添加到工程中。如下图:
在窗体上CTRL+W打开ClassWizard,选择“Member Variables”分页,添加空间对应的成员变量,弹出如下窗口:
点击“确定”按钮后出现如下窗口:
使用默认选项即可,点击OK后,添加变量的名称为m_myOcx。点击OK按钮返回窗体界面。打开FileView分页,新增了两个文件:onlineocx.cpp、onlineocx.h,为m_myOcx所属类的声明文件,其中包含在OnlineOcx工程中添加的自定义方法testFunc的声明和实现。
long COnlineOcx::testFunc(short* cParam1, short* cParam2, long* total, long* arr)
{
long result;
static BYTE parms[] =
VTS_PI2 VTS_PI2 VTS_PI4 VTS_PI4;
InvokeHelper(0x1, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
cParam1, cParam2, total, arr);
return result;
}
给“test”按钮添加单击事件,并添加如下代码:
void CTttDlg::OnButtonTest()
{
// TODO: Add your control notification handler code here
char cParam1[] = "this is param1. ";
char cParam2[50] = "this is param2. ";
int total = 0;
int iArr[10] = {0};
int iReturn = (int)m_myOcx.testFunc((short *)cParam1, (short *)cParam2, (long *)&total, (long*)iArr);
}
设置断点,调试运行,先弹出如下窗口:
查看内存,total的值被修改为123,iArr数组的值如下图:
结果验证无误。
总结说明:
1 在建立了测试工程后,若需要修改ocx的工程,编译时会提示文件被占用,把测试工程关掉,稍等几秒即可。
2 在测试工程中添加了ocx控件对应的成员变量后,测试工程中自动添加ocx控件对应的.h和.cpp文件,如果此时对ocx工程中的函数或属性等修改,测试工程里面的.h和.cpp是不会跟着改变的,删除ocx控件重新添加后也不行,手工修改也很麻烦,在这个简单的测试工程中,我是直接重新建的工程。有好方法的过客,欢迎留言指点。
3 生成的ocx控件可以通过VC自带的工具测试:「开始」菜单\程序\Microsoft Visual C++ 6.0\Microsoft Visual C++ 6.0 Tools\ActiveX Control Test Container。
------------------------------------------
在网页中调用ocx:
将ocx文件和其他dll使用wincab打包成.cab文件,*.inf参考如下:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
OnlineOcx.ocx=onlineocx.ocx
MFC42D.DLL=mfc42d.dll
MSVCRTD.DLL=msvcrtd.dll
MFCO42D.DLL=mfco42d.dll
OnLine.dll=online.dll
[onlineocx.ocx]
file-win32-x86=thiscab
RegisterServer=yes
clsid={BB12D646-17C0-41DC-A9C0-0F5E5FD29D53}
DestDir=11
FileVersion=1,0,0,1
[mfc42d.dll]
file-win32-x86=thiscab
RegisterServer=yes
DestDir=11
FileVersion=6,0,500
[msvcrtd.dll]
file-win32-x86=thiscab
RegisterServer=yes
DestDir=11
FileVersion=6,00,9782,0
[mfco42d.dll]
file-win32-x86=thiscab
RegisterServer=yes
DestDir=11
FileVersion=6,0,500
[online.dll]
file-win32-x86=thiscab
RegisterServer=yes
DestDir=11
FileVersion=1,0,0,1
[RegisterFiles]
%11%\onlineocx.ocx
配置文件中*.ocx必须写在第一个,不然在*.ocx之前的文件就略过了。
在网页中引用组件:
<OBJECT id="devread" name="devread" classid="clsid:BB12D646-17C0-41DC-A9C0-0F5E5FD29D53" codebase="Online_OCX.cab" style="HEIGHT: 10px; WIDTH: 10px">
</OBJECT>
<script language="JavaScript" type="text/JavaScript">
function testFunc()
{
//--初始化、装载样式文件
var iRes, i1, i2;
iRes = devread.testFunc("str1", "str2", i1, i2);
if(iRes != 0)
{
alert("失败!");
}
else
{
alert("success");
}
}
</script>
<a οnclick="javascript:testFunc();">调用接口</a>
打开网页时会提示下载组件,安装完成后,如果正确,如下图:
正确时,组件的图标是圆的。
如果组件有错误,例如ocx未正常注册,如下图:
错误时,组件图标是方的。