亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將COM事件從C#觸發到C ++的正確方法是什么

將COM事件從C#觸發到C ++的正確方法是什么

C++
慕工程0101907 2021-05-11 17:49:45
我們有一個項目,其中包含許多C ++(使用ATL),VB6和最近的C#遺留代碼。我們最近將組件從C ++移植到了C#,該事件觸發由C ++,VB6和C#中的組件處理的事件。從理論上講,一切正常,但是觸發事件會生成許多System.NotImplementedExceptions。我已經修改了觸發事件的代碼,以便它分別調用每個事件處理程序,這樣一個對象的異常不會阻止它在下一個對象中調用事件處理程序。if ( GeneratedChannelChange != null ){  // Invoke each handler separately, so that an exception in one invokation does not prevent us calling the next one.  foreach ( GeneratedChannelChangeEventHandler del in GeneratedChannelChange.GetInvocationList() )  {    try    {      del.Invoke ( GenChan, ChangeMask ) ;    }    catch  ( Exception ) {}  }}實際上,由ATL向導生成的原始C ++代碼也忽略了invoke函數返回的錯誤。這似乎工作正常,但是我對它產生的大量異常不滿意。在調試器中運行時,這也會降低性能。我認為只有在C ++類中處理事件時才會引發異常。這是使用ATL類IDispEventSimpleImpl實現的。我發現的是,IDispEventSimpleImpl沒有實現功能GetIDsOfNames??隙〞{用此函數,并且它將返回E_NOTIMPL??赡苁切碌腃#代碼正在調用函數GetIDsOfNames,而舊的C ++代碼沒有嗎?如果是這樣,是否有任何簡單的方法可以在使用IDispEventSimpleImpl的類中實現功能GetIDsOfNames?如果我的分析是錯誤的,是否有“正確”的方法在C#(作為事件源)和C ++(作為事件接收器)中實現事件邏輯?
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

我想,我已經解決了這一問題,通過更換IDispEventSimpleImpl的與IDispEventImpl的。


這或多或少是一個即插即用的替代品,但是它確實需要引用類型庫。


ATL類繼承了多個基類,包括一個定義為WorkspaceEventSink的基類。


class ATL_NO_VTABLE CImportChannels :

  ...

  public WorkspaceEventSink,

  ...

{

   ...

}

先前定義為


typedef IDispEventSimpleImpl< 42, CImportChannels, &DIID_ICs3WorkspaceEvents>        WorkspaceEventSink ;

我已將定義更改為


typedef IDispEventImpl< 42, CImportChannels, &DIID_ICs3WorkspaceEvents, &LIBID_McAnalEventsNET, 1, 0 >        WorkspaceEventSink ;

除了將IDispEventSimpleImpl更改為IDispEventImpl外,我還添加了類型庫的GUID及其主要版本號和次要版本號。


最初,我嘗試不使用主要版本號和次要版本號,但這導致了類型庫未注冊的異常。


無需進行其他更改(例如對接收器映射進行更改)。


查看完整回答
反對 回復 2021-05-23
  • 1 回答
  • 0 關注
  • 331 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號