__hook 關鍵 字

建立處理常式方法與事件的關聯。

注意

原生 C++ 中的事件屬性與標準 C++ 不相容。 當您指定 /permissive- 一致性模式時,它們不會編譯。

語法

long __hook(
    &SourceClass::EventMethod,
    source,
    &ReceiverClass::HandlerMethod
    [, receiver = this]
);

long __hook(
    interface,
    source
);

參數

&SourceClass::EventMethod
您用於連結事件處理常式方法的事件方法指標:

  • 原生 C++ 事件: SourceClass 是事件來源類別,而 EventMethod 是 事件。

  • COM 事件: SourceClass 是事件來源介面,而且 EventMethod 是它的其中一種方法。

  • Managed 事件: SourceClass 是事件來源類別,而 EventMethod 是 事件。

interface
要連結至 receiver 的介面名稱,僅適用于屬性參數 event_receivertrue 的 COM 事件接收器 layout_dependent

source
事件來源執行個體的指標。 視 中指定的 event_receiver 程式碼 type 而定, source 可以是下列其中一種類型:

  • 原生事件來源物件指標。

  • IUnknown型指標 (COM 來源)。

  • Managed 物件指標 (用於 Managed 事件)。

&ReceiverClass::HandlerMethod
要連結至事件的事件處理常式方法的指標。 處理常式會指定為類別的方法或相同 之參考。 如果您未指定類別名稱, __hook 假設類別是其從中呼叫的類別。

  • 原生 C++ 事件: ReceiverClass 是事件接收器類別,而且 HandlerMethod 是處理常式。

  • COM 事件: ReceiverClass 是事件接收器介面,而且 HandlerMethod 是它的其中一個處理常式。

  • Managed 事件: ReceiverClass 是事件接收器類別,而 HandlerMethod 是處理常式。

receiver
(選擇性)事件接收器類別實例的指標。 如果您未指定接收者,則預設值為呼叫的 __hook 接收者類別或結構。

使用方式

可以在事件接收器類別之外的任何函式範圍中使用,包括 main。

備註

使用事件接收器中的內建函 __hook 式,將處理常式方法與事件方法產生關聯或攔截。 然後,當來源引發指定事件時,就會呼叫指定的處理常式。 您可以將數個處理常式連結至單一事件,也可以將數個事件連結至單一處理常式。

有兩種 __hook 形式的 。 在大部分情況下,您可以使用第一個 (four-argument) 表單,特別是針對屬性的 layout_dependent 參數 event_receiverfalse 的 COM 事件接收器

在這些情況下,您不需要在介面中攔截所有方法,才能在其中一個方法上引發事件。 您只需要連結處理事件的方法。 您只能將 的第二個 (雙引數) 形式 __hook 用於在其中 layout_dependent= true 的 COM 事件接收器。

__hook 會傳回 long 值。 非零傳回值表示已發生錯誤 (Managed 事件擲回例外狀況)。

編譯器會檢查事件是否存在,以及事件簽章與委派簽章是否一致。

您可以呼叫 __hook 事件接收器以外的 __unhook 事件接收器,但 COM 事件除外。

使用 __hook 的替代方法是使用 += 運算子。

如需以新語法撰寫 Managed 事件程式碼的資訊,請參閱 event

注意

樣板類別或結構不能包含事件。

範例

如需範例,請參閱 原生 C++ 中的事件處理和 COM 中的事件處理。

另請參閱

關鍵字
事件處理
event_source
event_receiver
__event
__unhook
__raise