1. 程式人生 > >修改微軟TstCon容器原始碼,使其支援Python指令碼和ActiveX控制元件互動

修改微軟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和函式名的,如果有大俠知道,不勝感激!