zoukankan      html  css  js  c++  java
  • [转]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未正常注册,如下图:

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

  • 相关阅读:
    day15作业
    [原]iTop自定义修改相关时间字段的实现要点记录
    获取socket统计信息
    PG-跨库操作-postgres_fdw
    break跳出rewrite阶段,不会在匹配,进入输出阶段。 last 类似重新发起请求,所以会重新进行匹配。
    项目经验--把责任人定下来,流程理顺,工作开展会顺利很多
    异常排障
    docker stack的简单命令
    企业微信群机器人
    redis迁移方案 redis查看主从信息
  • 原文地址:https://www.cnblogs.com/vic_lu/p/2352561.html
Copyright © 2011-2022 走看看