ComCtl32.dll の Vista スタイルのダイアログを利用するTaskDialog ライブラリを利用する WinForms アプリケーションがあり、下位の OS ではエミュレートされた 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 ハンドラーを介した場合にのみ例外が発生する理由についての考え/解決策???