2009-10-23 62 views
7

我正在使用以下代碼調用TaskDialog。在C#中使用TaskDialog時出現EntryPointNotFoundException

[DllImport("ComCtl32", CharSet = CharSet.Unicode, PreserveSig = false)] 
    internal static extern void TaskDialogIndirect(
     [In] ref TASKDIALOGCONFIG pTaskConfig, 
     [Out] out int pnButton, 
     [Out] out int pnRadioButton, 
     [Out] out bool pfVerificationFlagChecked); 

但是,我得到的異常「無法找到DLL‘COMCTL32’名爲‘TaskDialogIndirect’的切入點。」

我拿了this code。我正在使用Windows 7 x64(RC)。

我在做什麼錯?

回答

8

沒有什麼不同之處,這是一個Vista功能

UPDATE: 這probem有並排組件與側做:這些功能目前只在COMCTL32.DLL版本6,但是,出於兼容性考慮,Vista將加載除非另有說明,否則請使用較早的版本。大多數人(包括我)所採取的方法是使用清單。這已被證明是棘手的,並且無論如何可能都不是正確的解決方案,尤其是如果您正在編寫的內容是庫:您不一定要強制整個應用程序使用通用控件6.

右邊解決方案是在調用其中一個僅限Vista的API時推送new activation上下文。激活上下文將使用正確版本的comctl32.dll,同時保留應用程序的其餘部分,並且不需要任何清單。

幸運的是,這很容易做到。一些完整的代碼已經存在MS Knowledgebase。文章中的代碼(KB 830033)照原樣處理。

替代託管API: 一個完整的包裝爲Vista的TaskDialog其實& TaskDialogIndirect可以在這裏找到:

http://code.msdn.microsoft.com/WindowsAPICodePack

對於WPF使用以下命令:

http://code.msdn.microsoft.com/VistaBridge下載 'VistaBridge樣品庫'一旦下載,打開該項目然後構建它(如果您想查看所有代碼,請檢查\ Library或\ Interop文件夾中的文件)。您現在可以從VistaBridge \ bin \ debug \中獲取DLL,並在項目中添加對其的引用,並且您必須爲每個不同的VistaBridge模塊添加一條using語句。例如:

使用Microsoft.SDK.Samples.VistaBridge.Interop或.Library或.Properties或.Services - 根據您的需要。

VistaBridge項目包含許多其他Vista功能(例如TaskDialog,Vista OpenFile和SaveFile對話框,當然還有Aero Glass Effects)的API,以便運行VistaBridge項目。

+0

這在Win7中被刪除? – 2009-10-23 10:40:19

+0

謝謝,我會研究它。 – Vivelin 2009-10-24 10:06:22

+0

VistaBridge成爲Windows API代碼包。 – 2010-06-14 19:00:26

3

使用任務對話需要Windows公共控件DLL(ComCtl32.dll)的版本6!出於兼容性原因,應用程序默認情況下不綁定到此版本。綁定到版本6的一個方法是將一個清單文件旁邊的可執行文件(名爲YourAppName.exe.manifest),具有以下內容:

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="*" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
    </dependency> 

此清單還可以嵌入爲您的可執行文件中Win32資源(名稱RT_MANIFEST和ID設置爲1),如果您不想擁有額外的獨立文件。如果您將項目屬性中的清單文件關聯起來,Visual Studio可以爲您完成這項工作。

相關問題