修改微軟TstCon容器源碼,使其支持Python腳本和ActiveX控件交互

關於ActiveX和腳本交互請看https://baike.baidu.com/item/ActiveX%E8%84%9A%E6%9C%AC%E7%BC%96%E7%A8%8B/3350788?fr=aladdin本文不再贅述

微軟TstCon用來加載ActiveX控件的一個容器,默認僅支持VBScript和JavaScript,其源碼在VS2010安裝目錄下Samples文件夾內,至於爲什麼要修改使其支持Python腳本呢,原因主要有2點,

一是由於本人手頭上的項目腳本是VBScript寫的,遇到一個問題,就是當控件代碼中有一個傳遞指針的事件函數,客戶端需要響應該事件並修改那個指針變量返回給控件,控件根據這個指針變量值得不同來實現不同的邏輯,大家都知道,TstCon和腳本是來測試控件的,但是在腳本代碼中,修改該指針變量後(VBScript通過ByRef來傳遞該參數)並不能返回到控件中,所以該事件功能並不能通過TstCon+VBScript來實現(加載ocx的最終客戶端當然可以實現,但不具備通用性,本文的重點是TstCon+腳本來測試控件)

二是Python語言的強大性碾壓了VBScript,採用Python後可以很方便的編寫測試代碼,方便管理

如何做:其實很簡單,主要是修改容器的LoadScript函數,加載Python腳本引擎(windows要安裝PythonWin且要和Python的版本一致,我採用的是python3.4),唯一遇到的問題是TstCon代碼中, hResult = m_pDispatch->GetTypeInfo( 0, GetUserDefaultLCID(), &pTypeInfo );pTypeInfo無法獲取,查閱資料得知,是因爲無法獲取類型庫信息,這個pTypeInfo得不到,就得不到腳本中的函數和dispod的對應關係,當然資料上的說法是需要自己寫一個idl文件然後用MIDL編譯爲tlb文件然後自己生成typelib,這樣做太麻煩了,除了寫腳本還要寫IDL文件,當然我是拒絕的,萬幸的是,GetIDsOfNames可以根據腳本中的函數名得到dispatchId,懂得com編程的都知道,只要有了函數名和dispatchId只要調用Invoke函數就能執行,那麼只要自己解析腳本,得到其中的函數名,然後就到了對應關係,進而可以填充CScript類的m_mapMacros,經驗證,問題1完美解決,因爲Python可以返回值,目前爲止,大功告成!


遺留的問題:既然GetIDsOfNames可以根據腳本中的函數名得到dispatchId,爲何pTypeInfo這個指針無法獲得??因爲後邊m_mapMacros也是通過pTypeInfo來填充dispID和函數名的,如果有大俠知道,不勝感激!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章