前提:
新建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的程式,它...