2013-10-16 58 views
1

所以我試圖在Win32中初始化公共控件和視覺樣式。我構建了一個包含我編寫的一些自定義控件的DLL,以及一個包含GUI應用程序的EXE。Win32公共控件初始化打破了自定義控件?

通常情況下,責任的分離似乎是我的DLL不應該擔心是否我們能夠幫助窗口樣式。它應該只生成自定義控件並將它們展示給相關的EXE。然後EXE可以決定它是否需要視覺樣式,而且DLL不是更聰明。

問題是這樣的:我有我的DLL註冊的窗口類DllMain中的進程附加。但是,如果我在EXE中調用InitCommonControlsEx,則不會顯示我的自定義控件中的按鈕和按鈕,因爲在EXE可以初始化常用控件之前,自定義控件已註冊。

爲了證明這一點,我強行定製的註銷和重新登記控制後的EXE叫INITCOMMONCONTROLSEX,並固定它:按鈕都出現在我的自定義控件,視覺造型。

在一個理想的世界,我希望能夠鏈接到我的共享庫在未來的計劃,並開始使用自定義控件沒有關於固定與通用控件和樣式問題任何後顧之憂。這可能嗎?

回答

5

簡短的回答是,你不打算註冊窗口類或DllMain()do much of anything

你應該提供一個單獨的Init()功能與你的DLL,該應用程序可以調用註冊DLL的控制,因爲它調用一個函數(InitCommonControls())註冊的通用控件同樣的方式出口。

+0

據我所知,有一個在DllMain中使用 – manuell

+0

的RegisterClass @manuell你可能要檢查的文檔進行的DllMain沒有問題。 「調用需要Kernel32.dll以外的DLL的函數可能會導致難以診斷的問題,例如,調用User,Shell和COM函數會導致訪問衝突錯誤,因爲某些函數會加載其他系統組件。 –

+0

是的,我知道,但請注意「_some functions_」。我不認爲RegisterClass是其中之一。 – manuell