2009-10-23 11 views
7

Ich verwende den folgenden Code, um einen TaskDialog aufzurufen.EntryPointNotFoundException bei Verwendung von TaskDialog in C#

[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); 

Allerdings bekomme ich die Ausnahme „Kann nicht einen Einstiegspunkt namens‚TaskDialogIndirect‘in DLL‚Comctl32‘finden.“

Ich nahm this code. Ich benutze Windows 7 x64 (RC).

Was mache ich falsch?

Antwort

8

Nichts außer dies ist ein Vista Feature

UPDATE: Diese probem mit nebeneinander Baugruppen zu tun hatten: diese Funktionen sind nur in comctl32.dll Version 6, aber aus Kompatibilitätsgründen wird Vista laden eine frühere Version, es sei denn, Sie sagen es anders. Der Ansatz, den die meisten Menschen (einschließlich mir) gewählt haben, besteht darin, ein Manifest zu verwenden. Dies hat sich als schwierig erwiesen und ist möglicherweise nicht die richtige Lösung, insbesondere wenn Sie eine Bibliothek schreiben: Sie müssen nicht unbedingt die gesamte Anwendung zwingen, allgemeine Steuerelemente zu verwenden.

Das Recht Die Lösung besteht darin, einen new activation Kontext beim Aufruf einer der Vista-only APIs zu pushen. Der Aktivierungskontext verwendet die richtige Version von comctl32.dll, während der Rest der Anwendung allein gelassen wird und kein Manifest erforderlich ist.

Glücklicherweise ist dies einfach zu tun.Einiger vollständiger Code, der bereits existiert MS Knowledgebase. Der Code aus dem Artikel (KB 830033) funktioniert so wie er ist.

Alternative Managed API: Eine vollständige Wrapper für Vista Taskdialog & TaskDialogIndirect hier gefunden werden kann:

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

Für WPF verwenden die folgenden:

Laden Sie die 'VistaBridge Sample Library' von http://code.msdn.microsoft.com/VistaBridge Einmal heruntergeladen, öffnen Sie das Projekt und bauen Sie es dann auf (wenn Sie den gesamten Code durchsehen möchten, untersuchen Sie die Dateien in den Ordnern \ Library oder \ Interop). Sie können jetzt die DLL von VistaBridge \ bin \ debug \ nehmen und in Ihrem Projekt einen Verweis darauf hinzufügen. Außerdem müssen Sie eine using-Anweisung für jedes der verschiedenen VistaBridge-Module hinzufügen. Beispiel:

mit Microsoft.SDK.Samples.VistaBridge.Interop oder .Library oder .Properties oder .Services - Abhängig von Ihren Anforderungen.

Das VistaBridge Projekt umfasst API für viele anderen Vista-Features (wie zB den Taskdialog, Vista und Openfile Savefile Dialoge, und natürlich die Aero Glass Effekte) diese aus, um zu versuchen, das VistaBridge Projekt.

+0

Das wurde in Win7 entfernt? –

+0

Danke, ich werde mich darum kümmern. – Vivelin

+0

VistaBridge wurde zum Windows API Code Pack. –

3

Die Verwendung von Task Dialog erfordert Version 6 der Windows Common Controls DLL (ComCtl32.dll)! Aus Kompatibilitätsgründen sind Anwendungen standardmäßig nicht an diese Version gebunden. Ein Weg, um Version zu binden 6 ist eine Manifest-Datei neben ausführbaren zu platzieren (benannt YourAppName.exe.manifest), mit folgendem Inhalt:

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

Dieses Manifest kann auch als Win32-Ressource in Ihrem ausführbaren eingebettet werden (mit dem Namen RT_MANIFEST und ID auf 1 gesetzt), wenn Sie die zusätzliche Standalone-Datei nicht haben möchten. Visual Studio kann diese Arbeit für Sie übernehmen, wenn Sie Ihre Manifestdatei den Projekteigenschaften zuordnen.