2009-06-09 113 views
2

我正在開發一個ActiveX控件,它現在主要用於WinForms應用程序。我可以加載多個COMCTL32.dll到一個進程中嗎?

ActiveX控件具有'屬性頁'對話框,可以使用AxHost類的ShowPropertyPages方法以編程方式顯示該對話框。這是可以在Visual Studio中提出來編輯控件屬性的自定義UI。

此屬性頁面對話框包含一個ListBox控件,它使用ImageList在列表項旁邊顯示圖標。這些圖標是32位的alpha混合位圖。爲了使這些顯示正確,必須使用版本6.0或更高版本的COMCTL32.DLL。

不幸的是,當我跑我的WinForms應用程序,它加載並使用COMCTL32.DLL版本5.xxx。因此,當顯示屬性頁面對話框時,圖標看起來很糟糕(半透明區域以純黑色繪製)。

我的問題是:有沒有什麼辦法可以確保該ActiveX控件的屬性頁UI中使用COMCTL32.DLL版本6.0 +從,無論什麼進程正在使用的?或者我可以強制主機進程使用版本6.0? (我認爲不是,因爲我認爲主機進程可能已經在ActiveX控件中的任何代碼之前將COMCTL32.DLL加載到內存中。

This webpage涵蓋了使用COMCTL32 6.0的一些場景,但不是我所處的情況英寸

回答

2

原來MSDN文章混淆了我,因爲它集中在一些特定的情況,其中沒有一個匹配我的。其實,底層技術是在談論作品多基因團結。

通過adding a 'manifest' xml file通過adding a 'manifest' xml file資源到ActiveX DLL,我可以向並行系統發出信號,表示我希望該DLL使用COMCTL32.DLL 6.x.該版本會自動加載。很不錯。

此清單需要爲資源類型RT_MANIFEST,資源ID爲。

下面是成功的證據: procexp screenshot showing two COMCTL32's loaded in process

(也,圖標正確ListBox中的顯示;)

0

如果您的應用程序調用Application.EnableVisualStyles()(通常調用Application.Run()之前啓動一個消息循環),那麼圖書館應該使用公共控件6+版本。

+0

呀,(在同一個進程中加載​​同一個DLL的兩個版本!)我在別處讀到這個。它的確如此,但它們並非如此。奇怪的! – mackenir 2009-06-10 07:11:44

相關問題