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 事
### 回答1: 将第三方OCX控件封装为新的OCX是指将已有的第三方OCX控件通过包装和封装的方式,生成一个新的OCX控件,使其具有更好的灵活性和适用性。 首先,我们需要了解第三方OCX控件的功能和使用方式。通过研究文档、源代码和示例,我们可以了解其各种属性、方法和事件。 接下来,我们可以创建一个新的OCX项目,并将第三方OCX控件的代码和资源文件添加到项目中。然后,我们可以对原有的代码进行修改和优化,以更好地适应项目需求。 在封装过程中,我们可以考虑对第三方OCX控件的界面进行重新设计,以确保其与项目的整体风格和界面一致。我们还可以增加新的属性、方法和事件,以提供更多的灵活性和扩展功能。 另外,在封装过程中,我们需要考虑跨平台的兼容性。将第三方OCX控件封装为新的OCX时,我们需要修改代码,确保其能够在不同的操作系统和开发环境下正常运行。 为了确保封装后的新OCX控件的稳定性和可靠性,我们还需要进行充分的测试。我们可以编写测试用例,并使用各种情况对新的OCX控件进行全面测试,以验证其功能是否符合预期。 最后,我们还需要编写使用新OCX控件的文档和示例代码,以方便其他开发人员使用和集成进他们的项目中。 总结起来,将第三方OCX控件封装为新的OCX,需要仔细研究其功能和实现方式,进行代码的修改和优化,进行兼容性测试,并编写使用文档和示例代码。通过这些步骤,我们可以生成一个更加灵活和适用的新OCX控件,满足项目的需求。 ### 回答2: 将第三方OCX控件封装为新的OCX,可以通过以下步骤进行: 1. 导入第三方OCX控件:将第三方OCX控件的文件导入到开发环境中,例如Visual Studio。确保已经安装了相关的依赖库和运行时环境。 2. 创建新的OCX工程:在开发环境中创建一个新的OCX工程,用于封装第三方OCX控件。可以选择不带界面的ActiveX控件,以确保封装的控件只提供接口和功能,而不涉及界面显示。 3. 导入第三方OCX控件到新的OCX工程:在新的OCX工程中,通过相关的功能或者宏命令,导入第三方OCX控件。这样就可以在新的OCX中使用第三方OCX的功能和接口。 4. 封装新的接口:根据实际需求,对第三方OCX控件中的接口进行封装。可以根据项目特定的需求,对接口进行增加、删除或者修改,以适应更好的使用。 5. 提供新的OCX控件接口:在新的OCX控件中,可以提供更简洁、易用和灵活的接口,以方便其他开发者使用该控件。可以考虑提供详细的文档和使用示例,以便其他用户更好地理解和使用该控件。 6. 进行测试和优化:在封装和提供接口之后,进行充分的测试,确保新的OCX控件的功能和接口能够正常工作,并符合预期。可以根据测试结果进行优化和修复bug,提高控件的性能和稳定性。 通过以上步骤,可以将第三方OCX控件封装为新的OCX,提供给其他开发者使用。这样可以根据项目的实际需求,对控件进行定制和优化,提供更好的使用体验和功能扩展。 ### 回答3: 将第三方OCX控件封装为新的OCX是指将第三方提供的OCX控件进行二次封装,以适应特定的需求以及使用环境。这种封装可以提供更简单、更高效的接口,同时可以隐藏底层复杂性,提高控件的可维护性和扩展性。 封装新的OCX控件的过程首先需要了解原始OCX控件的功能和接口。通过研究原始控件的使用方式和内部实现,我们可以对控件的功能进行拆分,并确定需要封装的功能点。 接下来,可以使用编程工具(如C++、C#等)创建新的OCX项目,并将原始OCX控件的代码部分集成到新的项目中。在集成的过程中,需要关注原始控件的依赖项和接口,确保新的封装控件与原始控件的兼容性。 在集成完成后,可以开始封装的工作。将与控件外部交互的接口进行优化,并提供更简单易用的属性、方法和事件。可以为控件添加新的功能或者扩展原有功能,以满足特定需求。同时,还可以针对性地进行性能优化,提高控件的执行效率。 封装完成后,需要进行测试和验证。测试环节主要验证新的OCX控件在不同的环境和使用场景下的稳定性和可靠性。通过对控件进行全面的功能测试和性能测试,确保控件的稳定性和性能满足预期要求。 最后,可以将封装完成的新的OCX控件进行文档编写和打包发布。在提供给其他开发人员使用时,应提供详细的使用说明和示例代码,以便其他开发人员能够快速上手和使用。 总之,将第三方OCX控件封装为新的OCX是为了提供更好的接口和更灵活的功能,以满足特定需求。这需要对原始控件进行理解和分析,并在封装过程中进行优化和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值