2012-09-12 82 views
2

我用Delphi實現了一個ActiveX控件。現在我想爲它添加一個事件。我使用類型庫編輯器來添加這樣的事件。用C#處理delphi的ActiveX控件事件

procedure OnActionMethod(ActionType: Integer; x1: Integer; 
    y1: Integer; x2: Integer; y2: Integer; param1: Double); dispid 213; 

TezDICOMXOnActionMethod = procedure(ASender: TObject; 
    ActionType: Integer; x1: Integer; y1: Integer; x2: Integer; y2: Integer; 
    param1: Double) of object; 

一切正常編譯。

現在我構建一個C#應用程序,使用該ActiveX控件並嘗試實現事件處理程序。

private AxezDICOMax.AxezDICOMX the_ezdicom; // this is the activeX object 

public void onActionHandler(object sender,long actiontype, 
    long x1, long y1, long x2,long y2, double param1) 
{ 
    MessageBox.Show("abcabc" + x1.ToString() + x2.ToString()); 
} 

private void MainForm_Load(object sender, System.EventArgs e) 
{   
    the_ezdicom.OnActionMethod += new 
    AxezDICOMax.IezDICOMXEvents_OnActionMethodEventHandler(this.onActionHandler); 
} 

但是,編譯與此錯誤

Error 1 No overload for 'onActionHandler' matches delegate 
    'AxezDICOMax.IezDICOMXEvents_OnActionMethodEventHandler' 
    OnActionMethodEventHandler 

我做了什麼錯的抱怨?我沒有在我的Delphi源碼的任何地方找到OnActionMethodEventHandler()

+1

TObject是Delphi類型。你不能通過COM邊界傳遞其中的一個。爲發件人選擇不同的類型,或完全刪除該參數。另一個明顯的錯誤是C#long是64位。使用int來匹配Delphi Integer。 –

+0

對不起,可能這是我的不好,但我可以刪除源文件中的ASender:Tobject。我想我應該用類型庫編輯器編輯它,但我不知道如何。請提供更多幫助。我把每一個「長」改爲「int」,沒有什麼不同。 –

+0

他們有沒有辦法解決這個問題?無論如何,我不需要從Asender讀取任何信息。 –

回答

1

我使用Visual Studio的自動完成功能來知道真正的方法應該是什麼。

void onActionHandler(object sender, AxezDICOMax.IezDICOMXEvents_OnActionMethodEvent e) 
{ 
    MessageBox.Show("abc"); 
}