我有一个 WinForms 应用程序,它使用了一个TaskDialog 库,该库利用 ComCtl32.dll 中的 Vista 样式对话框,对于较小的操作系统,它使用模拟的 win 表单......
但这不是问题......这个库工作正常,我们从来没有遇到过问题。到现在为止......事实上,如果我们在正常情况下启动一个对话框,那么它看起来很好。
但是,我在主窗体上添加了一个拖放处理程序,以捕获从其他来源(例如 Windows 资源管理器)删除的文件路径。如果该拖放处理程序是第一次显示对话框,那么我们会得到以下异常:
在 DLL“ComCtl32”中找不到名为“TaskDialogIndirect”的入口点。
这发生在第三方库调用:
/// <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 );
如果已显示对话框,则处理程序将运行正常。
表单的 DragDrop 处理程序没有显示InvokeRequired
,但我还是小心翼翼地通过引发对话框Form.Invoke
。
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);
}
}
}
}
作为一个方面:我在 64 位 Windows 7 机器上编译(并运行)它,但带有“AnyCPU”架构标志。
TaskDialogIndirect
关于为什么仅在第一次调用是通过 DragDrop 处理程序时才引发异常的任何想法/解决方案???