【问题标题】:How to create an AxHost solely in code [C#]如何仅在代码中创建 AxHost [C#]
【发布时间】:2008-09-19 22:15:29
【问题描述】:

我正在使用 COM Wrapper 与 Windows Media Player 交互。

它使用 AxHost 以某种方式包裹播放器,对我来说这一切都只是引擎盖下的魔法^^

AxHost.AttachInterfaces 看起来像这样

    protected override void AttachInterfaces() 
    {
        try 
        {   
            //Get the IOleObject for Windows Media Player.
            IOleObject oleObject = this.GetOcx() as IOleObject;

            //Set the Client Site for the WMP control.
            oleObject.SetClientSite(this as IOleClientSite);

            Player = this.GetOcx() as WMPLib.WindowsMediaPlayer; 
...

只要我将此 AxHost 托管在 Windows 窗体控件中,一切正常。但我无法在构造函数中连接事件。

这个例子不起作用:

    public WMPMediaRating()
    {
        var remote = new WMPRemote.RemotedWindowsMediaPlayer();
        _WMP = remote.Player;

        _WMP.MediaChange += new _WMPOCXEvents_MediaChangeEventHandler(_WMP_MediaChange);
    }

remote.Player 始终为 null,程序因 NullReferencesException 而崩溃。

AttachInterfaces() 中的代码不知何故仅在窗体绘制后或其他所有操作完成后才会执行。

我尝试手动调用 AttachInterfaces(),但这也不起作用,因为 GetOcx() 没有返回任何内容。


那么如何在没有 Windows 窗体的情况下实例化我的 AxHost 继承控件,以便在控制台应用程序中使用它?

【问题讨论】:

    标签: c# activex ocx


    【解决方案1】:

    仅供参考:没有人阻止您在控制台应用程序中使用隐藏窗口。

    您将无法在非 Windows 应用程序中托管媒体播放器 - 它需要托管。如果您想播放一些音乐,您可以使用媒体图表创建一个图表来呈现(播放)您的音乐文件 - 它不需要任何额外的托管。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多