ich eine WinForms-Anwendung, die Verwendung eines TaskDialog library macht, dass die Vista-Stil Dialoge von ComCtl32.dll und für weniger OS nutzt nutzt es eine emulierte win Form ...Ausnahme vorkommendes nur auf Drag & Drop-
Aber das ist nicht die Problem ... Diese Bibliothek funktioniert gut und wir hatten nie Probleme damit. Bis jetzt ... In der Tat, wenn wir unter normalen Umständen einen Dialog starten, dann sieht es gut aus.
Allerdings habe ich einen Drag-Drop-Handler auf meinem Hauptformular hinzugefügt, um Dateipfade zu erfassen, die aus anderen Quellen stammen (z. B. Windows Explorer). Wenn das Drag & Drop-Handler das erste Mal ist, dass der Dialog gezeigt, dann erhalten wir die folgende Ausnahme:
können nicht einen Einstiegspunkt finden namens ‚TaskDialogIndirect‘ in DLL ‚Comctl32‘.
Dies tritt am dritten Aufruf der Partei Bibliothek:
/// <summary>
/// TaskDialogIndirect taken from commctl.h
/// </summary>
/// <param name="pTaskConfig">All the parameters about the Task Dialog to Show.</param>
/// <param name="pnButton">The push button pressed.</param>
/// <param name="pnRadioButton">The radio button that was selected.</param>
/// <param name="pfVerificationFlagChecked">The state of the verification checkbox on dismiss of the Task Dialog.</param>
[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);
Wenn ein Dialog bereits gezeigt wurde, dann wird der Handler OK laufen.
Der DragDrop-Handler für das Formular zeigt nicht InvokeRequired
und ich war vorsichtig, den Dialog über Form.Invoke
sowieso zu erhöhen.
private void MainForm_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
Array fileNames = (Array)e.Data.GetData(DataFormats.FileDrop);
if (fileNames != null && fileNames.OfType<string>().Any())
{
foreach (var fileName in fileNames.OfType<string>())
{
this.Invoke(new Action<string>(this.AttemptOpenFromPath), fileName);
}
}
}
}
Als Seite: Ich bin Kompilieren (und läuft) es auf einer 64-Bit-Maschine Windows 7, aber mit der "AnyCPU" Architektur Flagge.
Irgendwelche Gedanken/Lösungen, warum die Ausnahme nur ausgelöst wird, wenn der erste Aufruf an TaskDialogIndirect
über den DragDrop-Handler ist ???
Das hängt davon ab, wie die Bibliothek funktioniert. – SLaks
Auf welchem Betriebssystem tritt die Ausnahme auf? – SLaks
Der Fehler besagt, dass Sie versuchen, die Funktion "TaskDialogIndirect" aufzurufen, wenn sie nicht verfügbar ist. Diese Funktion existiert erst ab Windows Vista, daher wird sie bei älteren Windows-Versionen fehlschlagen. Es hat nichts mit Drag and Drop zu tun. –