2009-10-23 8 views
7

Sto usando il seguente codice per chiamare una TaskDialog.EntryPointNotFoundException quando si utilizza 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); 

Tuttavia, ottengo l'eccezione "Impossibile trovare un punto di ingresso denominato 'TaskDialogIndirect' nella DLL 'ComCtl32'."

Ho preso this code. Sto usando Windows 7 x64 (RC).

Cosa sto sbagliando?

risposta

8

Nulla tranne che questa è una caratteristica vista

UPDATE: Questo probem ha a che fare con il lato da gruppi laterali: queste funzioni sono presenti solo in comctl32.dll versione 6, ma, per motivi di compatibilità, Vista caricherà una versione precedente a meno che tu non dica diversamente. L'approccio che la maggior parte delle persone (incluso me) sta prendendo è usare un manifest. Questo ha dimostrato di essere complicato, e potrebbe non essere la soluzione giusta comunque, specialmente se quello che stai scrivendo è una libreria: non devi necessariamente forzare l'intera applicazione a usare i controlli comuni 6.

Il diritto la soluzione è di spingere un contesto new activation quando si chiama una delle API Vista-only. Il contesto di attivazione utilizzerà la versione corretta di comctl32.dll lasciando da parte il resto dell'applicazione e non è richiesto alcun manifest.

Fortunatamente, questo è facile da fare. Un codice completo che esiste già MS Knowledgebase. Il codice dell'articolo (KB 830033) fa il trucco così com'è.

alternativa API Gestito: Un involucro pieno per di Vista TaskDialog & TaskDialogIndirect può essere trovato qui:

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

Per WPF utilizzare il seguente:

Scarica la 'Libreria Sample VistaBridge' dal http://code.msdn.microsoft.com/VistaBridge una volta scaricato, apri il progetto e poi lo compila (se vuoi vedere tutto il codice, esamina i file nelle cartelle \ Library o \ Interop). Ora puoi prendere la DLL da VistaBridge \ bin \ debug \ e aggiungere un riferimento ad essa nel tuo progetto, inoltre devi aggiungere un'istruzione using per ciascuno dei diversi moduli VistaBridge. Ad esempio:

utilizzando Microsoft.SDK.Samples.VistaBridge.Interop o .Library o .Properties o .Services - A seconda delle esigenze.

Il progetto VistaBridge include API per molte altre funzionalità di Vista (come TaskDialog, Vista OpenFile e SaveFile Dialogs e, naturalmente, gli effetti Aero Glass) per provarlo, eseguire il progetto VistaBridge.

+0

Che è stato rimosso in Win7? –

+0

Grazie, lo esaminerò. – Vivelin

+0

VistaBridge è diventato il pacchetto di codice API di Windows. –

3

L'utilizzo di Task Dialog richiede la versione 6 di Windows Common Controls DLL (ComCtl32.dll)! Per motivi di compatibilità, le applicazioni non si associano a questa versione per impostazione predefinita. Un modo per legarsi alla versione 6 è quello di mettere un file manifesto accanto al vostro eseguibile (chiamato YourAppName.exe.manifest), con il seguente contenuto:

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

Il manifesto può anche essere incorporato come una risorsa Win32 all'interno del vostro eseguibile (con il nome RT_MANIFEST e ID impostato su 1), se non si desidera avere il file standalone aggiuntivo. Visual Studio può fare questo lavoro per te, se si associa il file manifest nelle proprietà del progetto.