gpt4 book ai didi

c# - 使 COM 互操作事件从界面可见

转载 作者:行者123 更新时间:2023-12-05 06:44:09 25 4
gpt4 key购买 nike

我编写的代码如下例所示:

public delegate void ClickDelegate(int x, int y);
public delegate void PulseDelegate();

[Guid("39D5B254-64DB-4130-9601-996D0B20D3E5"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IButton
{
void Work();
}

// Step 1: Defines an event sink interface (ButtonEvents) to be
// implemented by the COM sink.
[GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ButtonEvents
{
void Click(int x, int y);
void Pulse();
}

// Step 2: Connects the event sink interface to a class
// by passing the namespace and event sink interface.
// ("EventSource.ButtonEvents, EventSrc").
[ComSourceInterfaces(typeof(ButtonEvents))]
public class Button : IButton
{
public event ClickDelegate Click;
public event PulseDelegate Pulse;

public Button() { }

public void CauseClickEvent(int x, int y) { Click(x, y); }
public void CausePulse() { Pulse(); }

public void Work() { /* Do some stuff */ }
}

这适用于 VB。当我这样定义它时:

Dim WithEvents obj As Button

但我想用这样的接口(interface)来定义它:

Dim WithEvents obj As IButton

这不起作用,因为事件在 IButton 界面中不可见。

有办法做到这一点吗?

最佳答案

连接到对象事件的变量必须声明为对象的类型 (CoClass)(在您的示例中为 Button)。接口(interface)(在您的示例中为 IButton)对事件一无所知,也不能用于请求它们。

这是我喜欢的思考方式:

An interface is something two objects agree on using so the "client" can send commands to the "server" ("server, do XYZ!"). An Event is just a different interface that the two objects also agree on using, but for the opposite: that is, for the "server" object to send commands to the "client".

是否支持给定的事件接口(interface)是对象的属性,而不是对象可能支持的任何接口(interface)的属性。服务器对象说:“给我一个 ButtonEvents 接口(interface)指针,我将用它来告诉您按钮何时被单击”。不是 IButton 界面提供了这个功能。

这也是为什么您必须将 [ComSourceInterfaces] 属性应用到类 Button,而不是接口(interface) IButtonButton CoClass 是提供报价的那个。

让事件看起来特别或奇怪的是,我们需要使用一种有点复杂和令人困惑的舞蹈(“连接点”)来传递事件的接口(interface)指针。 WithEvents 是让 VB6 为您“跳舞”的方法。

关于c# - 使 COM 互操作事件从界面可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30477004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com