2011-03-03 73 views
2

我解析了一些第三方軟件「腳本」,它根據它的內容生成一個GUI窗體,我想在C#程序中讀取腳本並生成類似的輸出,這裏是一個例子腳本:從CLSID動態加載ActiveX控件

BEGIN SECTION Intro 
    BACKPICTURE=xxxx.gif 
    PICTUREPOSN=Center 
    BEGIN CONTROL CLI 
    IS RADIO=NO 
     CLSID={49EBC3A3-727D-11CF-9BB9-080000001311} 
     POSITION=(24,16,250,45) 
     [email protected]:232 
     BEGIN PROPERTY Title 
     DISPID=2 
     SETTING=CLI : 
     TYPE=BSTR 
     END PROPERTY 
     BEGIN PROPERTY Arrangement 
     DISPID=3 
     SETTING=1 
     TYPE=I4 
     END PROPERTY 
     BEGIN PROPERTY EditBoxLength 
     DISPID=4 
     SETTING=3 
     TYPE=I4 
     END PROPERTY 

我感興趣的是BEGIN CONTROLBEGIN PROPERTY這些指示ActiveX控件的開始和它的屬性的屬性。

我的問題:我將如何通過它的CLSID加載此ActiveX控件並設置其屬性? Type.GetTypeFromCLSID似乎是我想要的,當我使用Activator.CreateInstance(Type)時,它不會拋出任何異常,因此它必須創建一個有效的實例,但如何設置一個屬性,然後將此控件「繪製」爲Windows窗體?

謝謝。

回答

4

這在.NET中很困難。一個ActiveX控件需要一個包裝來給它一個好客的家。該包裝器由AxHost類實現。不幸的是,你不能直接在代碼中使用這個類,它的構造函數是受保護的。它被設計爲由AxImp.exe工具使用。該工具自動生成一個派生自AxHost的.NET類。所得到的類隨即可用作對照。問題在於,當你設計你的表單時,該工具需要預先運行。除了這裏,這不是一個真正的問題。

你可以做的最好的事情是用AxImp爲你在前面的腳本中找到的任何ActiveX控件創建包裝。這可能是一個有限的子集。然後讓腳本解釋器根據clsid選擇正確的包裝器。像你想的那樣動態地做它需要你創建你自己的包裝。 AxHost然而不是一個小類和ActiveX託管是相當不愉快的許多細節照顧。

+0

感謝您的幫助漢斯。我開始用AxImp手動重新創建控件,但最終得到了一個GUID靜態地圖 - >我的控件,並從新創建了我自己的控件。 – eth0 2011-05-12 15:19:27