VB5 與 ActiveX 程式設計

每週一問: 挑戰您的 VB 功力 (初級篇, 98/03/01)


Q: 同樣的副程式, 只有參數的定義不相同, 問何者比較節省呼叫時間?
Sub SubX( ByVal S As String )
...
End Sub
Sub SubX( S As String )
...
End Sub

如果說副程式與呼叫程式位於同一個程式中, 則「S As String」的傳遞方式較快, 原因請參閱 98/02/08 的每週一問。但如果被呼叫的副程式位於 ActiveX code component 之中的, 而呼叫程式位於另一個獨立的程式, 結果又如何呢?

A: ActiveX code component 分成 ActiveX DLL 及 ActiveX EXE 兩種。

對 ActiveX DLL 而言, 如果被程式 A 所引用, 則 ActiveX DLL 之中的變數將與程式 A 的變數使用相同的「定址空間」, 而「S As String」的傳「位址」工作模式在 ActiveX DLL 與應用程式之間並不會有任何問題。

但如果是 ActiveX EXE, 由於 ActiveX EXE 本身是獨立的執行檔, 所以與應用程式之間的「定址空間」是各自獨立的, 簡單地說, 傳位址在 ActiveX EXE 與應用程式之間是有問題的。 而 VB 為了讓應用程式能夠以「S As String」的方式傳遞參數到 ActiveX EXE 的副程式中, 所採用的方法如下:

可以發現 傳遞參數的過程中, 含有兩次複製資料的動作, 反而比「ByVal S As String」(只有傳遞時複製一次資料) 多了一次。

所以當我們呼叫的是 ActiveX EXE 的副程式時, 「S As String」反而是執行效能較低的。