OCX开发与第三方OCX封装

 

首先感谢网络上朋友们无私的共享,我才得以从一无所知到完美解决OCX开发中的问题,如果你也对OCX一窍不通,而需要在WEB客户端中操作第三方OCX,恰好第三方OCX又无法完全满足你的需求,那么这篇文章应该对你有所帮助,来吧。

1.创建一个MFC OCX工程

点击完成就ok了

现在你已经创建了一个OCX框架了,你想在WEB上应用吗?必须实现OCX安全机制,否则IE不会运行的,now,let go!

2.实现安全机制

在FIleView视图中,打开NewTestCtl.h文件,在public定义中插入如下代码

复制代码
    // 去掉安全警告 BEGIN 
    DECLARE_INTERFACE_MAP() 
        BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety) 
        STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions); 
        STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions); 
    END_INTERFACE_PART(ObjectSafety) 
复制代码

    //去掉安全警告 END 

然后是TestfingerCtrl.CPP文件中IMPLEMENT_DYNCREATE(CTestfingerCtrl, COleControl)代码后面添加如下代码

复制代码
// 去掉安全警告 BEGIN 
BEGIN_INTERFACE_MAP(CTestfingerCtrl, COleControl) 
    INTERFACE_PART(CTestfingerCtrl, IID_IObjectSafety, ObjectSafety) 
END_INTERFACE_MAP() 
 
// Implementation of IObjectSafety 
STDMETHODIMP CTestfingerCtrl::XObjectSafety::GetInterfaceSafetyOptions( 
    REFIID riid, 
    DWORD __RPC_FAR *pdwSupportedOptions, 
    DWORD __RPC_FAR *pdwEnabledOptions) 

    METHOD_PROLOGUE_EX(CTestfingerCtrl, ObjectSafety); 
    if (!pdwSupportedOptions || !pdwEnabledOptions) 
    { 
        return E_POINTER; 
    } 
    *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; 
    *pdwEnabledOptions = 0
    if (NULL == pThis->GetInterface(&riid)) 
    { 
        TRACE( " Requested interface is not supported.\n "); 
        return E_NOINTERFACE; 
    } 
    // What interface is being checked out anyhow? 
    OLECHAR szGUID[ 39]; 
    int i = StringFromGUID2(riid, szGUID, 39); 
    if (riid == IID_IDispatch) 
    { 
        // Client wants to know if object is safe for scripting 
        *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER; 
        return S_OK; 
    } 
    else if (riid == IID_IPersistPropertyBag 
            || riid == IID_IPersistStreamInit 
            || riid == IID_IPersistStorage 
            || riid == IID_IPersistMemory) 
    { 
        // Those are the persistence interfaces COleControl derived controls support 
       
// as indicated in AFXCTL.H 
       
// Client wants to know if object is safe for initializing from persistent data 
        *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA; 
        return S_OK; 
    } 
    else 
    { 
        // Find out what interface this is, and decide what options to enable 
        TRACE( " We didn't account for the safety of this interface, and it's one we support\n "); 
        return E_NOINTERFACE; 
    } 

 
STDMETHODIMP CTestfingerCtrl::XObjectSafety::SetInterfaceSafetyOptions( 
    REFIID riid, 
    DWORD dwOptionSetMask, 
    DWORD dwEnabledOptions) 

    METHOD_PROLOGUE_EX(CTestfingerCtrl, ObjectSafety); 
    OLECHAR szGUID[ 39]; 
    // What is this interface anyway? 
   
// We can do a quick lookup in the registry under HKEY_CLASSES_ROOT\Interface 
    int i = StringFromGUID2(riid, szGUID, 39); 
    if ( 0 == dwOptionSetMask && 0 == dwEnabledOptions) 
    { 
        // the control certainly supports NO requests through the specified interface 
       
// so it"s safe to return S_OK even if the interface isn"t supported. 
        return S_OK; 
    } 
 
    // Do we support the specified interface? 
    if (NULL == pThis->GetInterface(&riid)) 
    { 
        TRACE1( " %s is not support.\n ", szGUID); 
        return E_FAIL; 
    } 
 
    if (riid == IID_IDispatch) 
    { 
        TRACE( " Client asking if it's safe to call through IDispatch.\n "); 
            TRACE( " In other words, is the control safe for scripting?\n "); 
        if (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions) 
        { 
            return S_OK; 
        } 
        else 
        { 
            return E_FAIL; 
        } 
    } 
    else if (riid == IID_IPersistPropertyBag 
        || riid == IID_IPersistStreamInit 
        || riid == IID_IPersistStorage 
        || riid == IID_IPersistMemory) 
    { 
        TRACE( " Client asking if it's safe to call through IPersist*.\n "); 
            TRACE( " In other words, is the control safe for initializing from persistent data?\n "); 
        if (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions) 
        { 
            return NOERROR; 
        } 
        else 
        { 
            return E_FAIL; 
        } 
    } 
    else 
    { 
        TRACE1( " We didn\"t account for the safety of %s, and it\"s one we support\n ", szGUID); 
        return E_FAIL; 
    } 

 
STDMETHODIMP_(ULONG) CTestfingerCtrl::XObjectSafety::AddRef() 

    METHOD_PROLOGUE_EX_(CTestfingerCtrl, ObjectSafety) 
    return (ULONG)pThis->ExternalAddRef(); 

 
STDMETHODIMP_(ULONG) CTestfingerCtrl::XObjectSafety::Release() 

    METHOD_PROLOGUE_EX_(CTestfingerCtrl, ObjectSafety) 
    return (ULONG)pThis->ExternalRelease(); 

 
STDMETHODIMP CTestfingerCtrl::XObjectSafety::QueryInterface(REFIID iid, LPVOID* ppvObj) 

    METHOD_PROLOGUE_EX_(CTestfingerCtrl, ObjectSafety) 
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); 
复制代码

//去掉安全警告 END 

好了,编译吧,这次IE中可以使用了,IE需要classid,打开VC6光盘的COMMON\TOOLS目录,运行OLEVIEW.EXE文件,查看controls下面newtest控件名字就得到classid了,下图是百度音乐的classid:3C294567-XXXXXXX

好了,基本的OCX框架有了,安全接口有了,下次该把第三方OCX集成进来了,做这个文章太累了,上传图片好麻烦,就不能简单点么?

3.插入第三方控件

在插入第三方控件之前,大家编译一下程序,然后用common\tools\TSTCON32.EXE这个程序来测试一下,你会看到你的OCX显示为一个椭圆形,这是MFC自动生成的,打开NewTestCtl类的Ondraw函数你会看到代码

pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

pdc->Ellipse(rcBounds);

这种GDI方式显示控件不是我们需要的,注释掉,然后在ResouceView视图中插入一个新的对话框

在对话框上点击鼠标右键,属性,样式选下层,英文版是child,更多样式中可见一定要勾上

完成后再在对话框上点击鼠标右键,插入ActiveX控件

插入完毕后,控件显示在对话框中,然后Ctrl+W打开Class Wizard,如图,提示添加对话框类,点击ok,创建一个CmainDlg类

然后点击ClassWizard的Member Vairables 选项卡,看看Class name里面是刚才创建的CMainDlg这个类,在下面的Control IDs是自动生成的控件ID,第一个就是我使用的ActiveX控件ID,点击这个控件ID,再点击AddVariable,我们要为这个控件绑定一个变量。

然后弹出这个提示框,MFC自动为这个控件生成一个类,是不是很棒?

点击ok

给变量起一个名字,再ok

到这里基本工作做的差不多了,接下来我们就要把这个窗口显示出来,打开NewTerstCtl.h添加代码

#include "MainDlg.h"

然后在CNewTestCtrl类中定义窗口变量

CMainDlg m_dlg;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01 , 01.txt 《 VB6.0中通过MSChart控件调用数据库 》 02 , 02.txt 《 用VB6实现动态增减控件 》 03 , 03.txt ActiveX控件的创建 04 , 04.txt ADO控件和DATA控件的冲突(不能共存)的解决方法 05 , 05.txt Combo的自动查询技术 06 , 06.txt DirectX7.0使用心得(1) 07 , 07.txt DirectX7.0使用心得(2) 08 , 08.txt DirectX7.0使用心得(3) 09 , 09.txt FSO对象模型在VB中的应用 10 , 10.txt MsComm 控件的文字传输范例 11 , 11.txt Office或IE4风格的ToolBar 12 , 12.txt Regsvr32.exe注册控件的具体用法 13 , 13.txt TextBox的自动调节 14 , 14.txt TextBox实现打印机效果 15 , 15.txt TreeView的基本操作 16 , 16.txt VB5中DBGRID控件在VB6中使用 17 , 17.txt VB6.0动态加载ActiveX控件漫谈 18 , 18.txt VB与MS-Draw开发通用作图软件 19 , 19.txt VB中APP对象及其应用 20 , 20.txt VB中list控件的功能扩充 21 , 21.txt VB中防止将重复项目添加到列表框控件中 22 , 22.txt VB中用Multimedia MCI控件开发多媒体应用 23 , 23.txt Win Api在VB中的妙用 24 , 24.txt WINDOWS SCRIPT HOST对象在VB中的使用 25 , 25.txt 安装向导生成程序组并建立多个程序项 26 , 26.txt 保存复选框选项 27 , 27.txt 不用OCX来创建自己的控件(一) 28 , 28.txt 成组更新控件属性 29 , 29.txt 创建数据驱动窗体 30 , 30.txt 得到鼠标位置 31 , 31.txt 调整 Combo 下拉部分的宽度 32 , 32.txt 动态加入控件到VB控件数组中 33 , 33.txt 对ListView中的列排序 34 , 34.txt 放一个Combo到Toolbar中 35 , 35.txt 改变 ListIndex而不发生 Click 事
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值