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未正常注册,如下图:

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

  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/vic_lu/p/2352561.html
Copyright © 2011-2022 走看看