2012-12-20 62 views
7

我試圖在應用程序中啓用常用控件。我遵循了this MSDN article中給出的步驟,特別是Using ComCtl32.dll Version 6 in an Application That Uses Only Standard Extensions。但我無法讓它工作。如何在Windows應用程序中啓用常用控件

我與文章的唯一不同之處在於我在中添加清單信息項目屬性頁|配置屬性|鏈接器|清單文件|額外的艙單依賴關係。這是我在文本框中輸入的內容:

「type ='Win32'name ='Microsoft.Windows.Common-Controls'version ='6.0.0.0'processorArchitecture ='*'publicKeyToken ='6595b64144ccf1df'language = '*'xmlns ='http://schemas.microsoft.com/developer/msbuild/2003'「;%(AdditionalManifestDependencies)

當我檢查生成的清單(MyApp.exe.intermediate.manifest)時,它看起來是正確的。

我還在ComCtl32.lib中添加鏈接依賴項項目屬性|配置屬性|鏈接器|輸入|額外的依賴關係。我也有這樣的初始化INITCOMMONCONTROLSEX結構致電INITCOMMONCONTROLSEX在啓動時:

INITCOMMONCONTROLSEX icex; 
icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
icex.dwICC = ICC_STANDARD_CLASSES; 

但調用INITCOMMONCONTROLSEX總是返回FALSE(這意味着它失敗)。經過一番調查後,我發現從GetLastError返回的錯誤代碼是ERROR_FILE_NOT_FOUND。可能是什麼問題呢?

更新:我注意到一些可能與「文件未找到錯誤」有關的東西。當我從調試器中運行應用程序,在輸出窗口的線路之一是:

'MyApp.exe將':已加載「C:\ WINDOWS \ winsxs文件\ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002。 18305_none_88f3a38569c2c436 \ comctl32.dll中」,無法找到或打開PDB文件

不過,也有一些像KERNEL32.LIB,USER32.LIB更標準庫的一堆類似的路線,等:

'MyApp.exe':Loaded'C:\ Windows \ System32 \ ntdll.dll',無法找到或打開PDB文件

'MyApp.exe將':已加載 'C:\ WINDOWS \ SYSTEM32 \ kernel32.dll中',無法找到或打開PDB文件

'MyApp.exe將':已加載「C:\ Windows \ System32下\ MSVCRT.DLL」,無法找到或打開PDB文件

'MyApp.exe將':已加載 'C:\ WINDOWS \ SYSTEM32 \ user32.dll中',無法找到或打開PDB文件

這些行總是出現在任何應用程序中,並且不會造成任何問題。 ComCtl32.dll可能會有所不同嗎?

+0

所以我會問這個明顯的問題。它工作*沒有*手動添加清單信息? – WhozCraig

+0

@WhozCraig試了一下,沒有工作。 – user1610015

+0

您是否認爲調用InitCommonControls()(而不是Ex verson)作爲WinMain的第一行。這不行嗎?或者你是否想要獲得一種新的視覺風格? – selbie

回答

10

好的。我做了一些家庭作業,並發現了一些新的東西。我如何最終得到了這個工作是幾乎你想要做什麼:

  1. 轉到項目/屬性/連接/清單文件/附加清單依賴
  2. 輸入以下文本逐字(意思是所有單引號和雙引號,如下所示)。這一切都在一條線上,順便說一句。

    "type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"

  3. 保存設置的做一個完整的項目(如果不解決方案)重建強制清單和PCH再生。

此前這樣做下面是我的負荷列表:

加載 「C:\ WINDOWS \ winsxs文件\ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 5.82.7601.17514 _none_ec83dffa859149af \ comctl32.dll'

手動forcnig公共控件的清單版本後,加載列表現在包含此(並正確地回答爲TRUE到InitCommonControlsEx(),這是所有這一切在首位的點):

加載 'C:\的Windows \ WINSXS \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 6.0.7601.17514 _none_41e6975e2bd6f2b2 \ COMCTL32.DLL'

注意:您也可以使用源內#pragma來做到這一點,理想情況是在您的stdafx.h頭文件中,但我更喜歡這種方式。

希望它有幫助。

+0

謝謝,它現在有效!所以唯一導致錯誤的是「xmlns」屬性。我甚至不知道該屬性是如何在第一時間得到的,因爲我剛剛複製並粘貼了MSDN文章上的內容。它一定是由VS添加的,而我試圖讓報價正確。 – user1610015

8

不,關於PDB文件的警告只是爲了告訴您,您沒有Windows系統DLL的調試信息。從InitializeCommonControlsEx()獲取FALSE返回值當然是關鍵問題。

您使用的Additional Manifest Dependencies字符串有問題。我修了一會兒,但找不到這個缺陷。在源代碼中指定鏈接器選項通常更容易。一切運作良好,當我用:

#include <CommCtrl.h> 
#pragma comment(lib,"comctl32.lib") 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

只需複製和上面的代碼段粘貼到您的源文件之一。

相關問題