2

这个问题是本文的延伸。

在同样的情况下,我通过它创建了一个 WMP ActiveX 实例ProgID

protected const string WMP_PROG_ID = "WMPlayer.OCX.7";

private dynamic _wmp;

protected virtual bool init(){
    try{
        _wmp = Activator.CreateInstance(Type.GetTypeFromProgID(WMP_PROG_ID));
    }
    catch{ return false; }
    return connectEvent();
}

根据MSDN文档,WMPlayer 对象中有一个Error事件和一个error属性。因此,我尝试以这种方式附加事件。

protected bool connectEvent(){
    try{
        _wmp.PlayStateChange += new StateHandler(_wmp_PlayStateChange);
        //_wmp.Error += new Action(_wmp_ErrorEvent);
    }
    catch { return false; }
    return true;
}

protected void _wmp_PlayStateChange(WMPlayerState state){
    //do something I like
}

protected void _wmp_ErrorEvent(){
    //do some error handling
}

如果我继续//_wmp.Error += new Action(_wmp_ErrorEvent)评论,则没有编译错误并且PlayStateChange效果很好。

但是,如果我删除注释标记,则会出现运行时异常。 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: can not apply operator "+=" between 'System.__ComObject' and 'System.Action'

似乎这两个“错误”是冲突的,因为 COM 不区分大小写。我该如何解决?我的目标是在不使用 AxWindowsMediaPlayer 的情况下附加到“错误”事件。

4

1 回答 1

0

我遇到了和你非常相似的问题,但我的问题是Size. 重新定义了强类型 ActiveX 控件Size,因此我需要将其转换回Control表单设计者想要在我的表单上调整控件大小的时候。

((Control)this.axLEAD1).Size = new System.Drawing.Size(298, 240);

如果您可以获得 com 对象的强类型类(通过添加引用或使用tlbimp.exe),则可以强制转换为强类型 com 对象,而不是__ComObject使用正确的方法。

于 2013-04-10T03:54:39.703 回答