[转]VC6.0中使用MFC开发ActiveX及简单验证

运行环境: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 onclick="javascript:testFunc();">调用接口</a>

打开网页时会提示下载组件,安装完成后,如果正确,如下图:

正确时,组件的图标是圆的。

如果组件有错误,例如ocx未正常注册,如下图:

错误时,组件图标是方的。

posted on 2012-02-15 14:20  和轩僮  阅读(1049)  评论(0编辑  收藏  举报

导航