彩票走势图

在 .NET Compact Framework 2.0 中宿主 ActiveX 控件(四)

翻译|其它|编辑:郝浩|2006-06-23 17:02:00.000|阅读 2110 次

概述:

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

实现

在完整的框架中,控件宿主功能是在 AxHost 类中实现的。AxHost 类与 CAxHostWindow 类十分相似,后者是一个 ATL 模板类,定义了一个可以宿主 ActiveX 控件的窗口。与 CAxHostWindow 类似,完整框架中的 AxHost 此时能完成的任务大大超出您的需要。在该实现中,您能做到的远不止对工具栏、属性页、框架等的操作。

为了让实现更易于管理,您需要引入几个功能部件来封装整体设计的某些逻辑子集。例如,容器支持将在 AxContainer 类中实现,如图 1 所示。OleSite 类将负责与站点相关的接口,并负责与控件的 IObjectWithSite 接口交互。

声明并实例化控件

要在 .NET Compact Framework 中宿主控件,您需要完成两个主要任务。需要使用 COM 接口定义创建一个导入库,并构建一个从 AxHost 类派生的控件类。

获得一个 COM 接口定义

要宿主控件,需要在从 AxHost 类派生的类中实现特定于控件的接口(IDispatchIUnknown)。例如,Microsoft Windows Media Player 控件支持这样的调度接口:它们允许获取和设置属性,以及接收事件。它还支持 IUnknown 接口(如 IWMPCoreIWMPPlayer),这些接口可以并且应该直接映射到 .NET Compact Framework 类和接口。AxHost 类允许您通过 GetOcx 方法访问控件的 IUnknown 接口。如果您在 .NET Compact Framework 代码中有一个 COM 接口定义,则只需将 GetOcx 方法返回的对象类型转换为接口类型,框架就会内部执行 QueryInterface 方法。

手动创建接口定义

某些情况下,您会有一个 .idl 文件,它是由控件或 SDK 提供的。这种文件的定义可以手动转换为 .NET Compact Framework。要这么做并不容易,而且很容易出错。该方法是您最后的一招 - 当本文描述的其他方法不可用时。

例如,IWMPCdrom 接口是在完整的 Windows Media Player 10 中定义的,如以下示例代码所示。

[
    object,
    uuid(74C09E02-F828-11d2-A74B-00A0C905F36E),
    dual,
    helpstring("IWMPControls: Public interface."),
    pointer_default(unique)
]
interface IWMPControls : IDispatch
{
    [ id( DISPID_WMPCONTROLS_ISAVAILABLE ), propget ]
        HRESULT isAvailable( [in] BSTR bstrItem, [out, retval] VARIANT_BOOL *pIsAvailable );
    [ id( DISPID_WMPCONTROLS_PLAY ) ]
        HRESULT play();
    [ id( DISPID_WMPCONTROLS_STOP ) ]
        HRESULT stop();
    [ id( DISPID_WMPCONTROLS_PAUSE ) ]
        HRESULT pause();
    [ id( DISPID_WMPCONTROLS_FASTFORWARD ) ]
        HRESULT fastForward();
    [ id( DISPID_WMPCONTROLS_FASTREVERSE ) ]
        HRESULT fastReverse();
    [ id( DISPID_WMPCONTROLS_CURRENTPOSITION ), propget ]
        HRESULT currentPosition( [out, retval] double * pdCurrentPosition );
    [ id( DISPID_WMPCONTROLS_CURRENTPOSITION ), propput ]
        HRESULT currentPosition( [in] double dCurrentPosition );
    [ id( DISPID_WMPCONTROLS_CURRENTPOSITIONSTRING ), propget ]
        HRESULT currentPositionString( [out, retval] BSTR * pbstrCurrentPosition );
    [ id( DISPID_WMPCONTROLS_NEXT ) ]
        HRESULT next();
    [ id( DISPID_WMPCONTROLS_PREVIOUS ) ]
        HRESULT previous();
    [ id( DISPID_WMPCONTROLS_CURRENTITEM ), propget ]
        HRESULT currentItem( [out, retval] IWMPMedia **ppIWMPMedia);
    [ id( DISPID_WMPCONTROLS_CURRENTITEM ), propput ]
        HRESULT currentItem( [in] IWMPMedia *pIWMPMedia );
    [ id( DISPID_WMPCONTROLS_CURRENTMARKER ), propget ]
        HRESULT currentMarker( [out, retval] long *plMarker);
    [ id( DISPID_WMPCONTROLS_CURRENTMARKER ), propput ]
        HRESULT currentMarker( [in] long lMarker);
    [ id( DISPID_WMPCONTROLS_PLAYITEM )]
        HRESULT playItem( [in] IWMPMedia *pIWMPMedia );
}

该接口 (IWMPCdrom) 可在 .NET Compact Framework 代码中定义,如以下示例代码所示。

    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [Guid("74C09E02-F828-11D2-A74B-00A0C905F36E")]
    public interface IWMPControls
    {
        [DispId(60)]
        IWMPMedia currentItem { get; set; }
        [DispId(61)]
        int currentMarker { get; set; }
        [DispId(56)]
        double currentPosition { get; set; }
        [DispId(57)]
        string currentPositionString { get; }

        [DispId(54)]
        void fastForward();
        [DispId(55)]
        void fastReverse();
        [DispId(62)]
        bool get_isAvailable(string bstrItem);
        [DispId(58)]
        void next();
        [DispId(53)]
        void pause();
        [DispId(51)]
        void play();
        [DispId(63)]
        void playItem(IWMPMedia pIWMPMedia);
        [DispId(59)]
        void previous();
        [DispId(52)]
        void stop();
    }

前面提到过,这不是您想使用的方法,除非您不得不使用它。您必须显式定义接口的一种情况是:使用 TLBIMP 工具的自动导入产生了不希望的结果,或者出于某种原因您不能使用接口的平台调用定义。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP