ocx中fireevent注意要點

2021-07-03 08:54:08 字數 780 閱讀 9948

前提:

新建ocx開發的工程,生成的主類叫 ctestocxctrl ,新增乙個外部介面:testinte***ce()

然後新增乙個事件:testwrongevent(long result)

現象:1、就在ctestocxctrl下,如果直接在介面函式testinte***ce裡,傳送事件testwrongevent(123); 外部容器是能收到這個事件的。

2、在外部介面testinte***ce裡建立個執行緒,我用的afxbeginthread,然後在這個執行緒裡傳送事件testwrongevent(123) 外部容器就是收不到。。。

答案就是:

首先 不要在內部建立的執行緒呼叫fireevent,postmessage到activex控制項視窗,由那裡呼叫fireevent

你必須在主線程中激發事件,你在工作執行緒中投遞乙個訊息到主線程中,然後再激發事件,但你最好不要用視窗類的指標,應該用視窗控制代碼傳送,就像這樣::postmessag(hwnddlg,...);

那是因為fireevent實際上是呼叫客戶端實現的乙個介面(在這就是ie實現的idispatch介面)的方法,而activex控制項一定是放在sta套間(雖然也可以,但應該沒人實現為放在mta)的,因此工作執行緒呼叫ie的idispatch介面一定且必須是**介面,這個介面必須通過匯集得到(以建立**物件)。

即需要在主線程呼叫comarshalinte***ce來列集ie的那個idispatch介面,再在工作執行緒呼叫counmarshalinte***ce來散集idispatch介面,進而在工作執行緒中通過散集的idispatch介面發起事件

ocx中fireevent注意要點

前提 新建ocx開發的工程,生成的主類叫 ctestocxctrl 新增乙個外部介面 testinte ce 然後新增乙個事件 testwrongevent long result 現象 1 就在ctestocxctrl下,如果直接在介面函式testinte ce裡,傳送事件testwrongeve...

在delphi中ocx控制項的安裝

第一步 使用過activex的人都知道,activex不註冊是不能夠被系統識別和使用的,一般安裝程式都會自動地把它所使用的activex控制項註冊,但如果你拿到的乙個控制項需要手動註冊怎麼辦呢?如果修改登錄檔那就太麻煩了,在windows的system資料夾下有乙個regsvr32.exe的程式,它...

在delphi中ocx控制項的安裝

第一步 使用過activex的人都知道,activex不註冊是不能夠被系統識別和使用的,一般安裝程式都會自動地把它所使用的activex控制項註冊,但如果你拿到的乙個控制項需要手動註冊怎麼辦呢?如果修改登錄檔那就太麻煩了,在windows的system資料夾下有乙個regsvr32.exe的程式,它...