6

私はアプリケーションを作成していて、TaskDialogIndirect関数を使用したかったのですが、大量の P/Invoke などを書きたくなかったので、WinAPICodePack を含めました。ただし、問題が 1 つあります。のコントロールを作成TaskDialogしてダイアログに追加すると、すべて正常に動作します。ただし、Showメソッドを実行するOverflowExceptionと、mscorlib が発生します。これを追跡して、いくつかのポインター処理とマーシャリングにたどり着きました。

コードを試してみると、DLLを .NET 3.5 およびインクルード アプリTOO用にコンパイルする必要があることがわかりました。アプリを .NET 4.0 で使用すると、このエラーが発生します...回避策についてのアイデアはありますか?または、このエラーを再現できますか?

もう 1 つの問題は、Iconプロパティを好きなように設定できることですが、アイコンがまったく表示されません。Openedアイコンを動的に設定するイベントをセットアップする必要があります...

情報: Windows 8 Pro x64 RTM で Visual Studio 2012 RTM を実行しています。アプリケーションは標準の WPF アプリです。

サンプルコード:

TaskDialog td = new TaskDialog();
td.Cancelable = true;
td.Caption = "Caption";
td.InstructionText = "Instructions";
td.Text = "Text";

TaskDialogCommandLink buttonElevation =
    new TaskDialogCommandLink("elevation", "Elevation Required Sample");
buttonElevation.UseElevationIcon = true;

td.Controls.Add(buttonElevation);
td.Show(); // OverflowException occurs here!
4

1 に答える 1

9

基本的に 32 ビット/64 ビット エラーであったこの問題を修正しました。NativeTaskDialog.csファイルには重要な行が1つあり、それは関数にあります

IntPtr AllocateAndMarshalButtons(
    TaskDialogNativeMethods.TaskDialogButton[] structs)

次の行を見つける必要があります

 currentPtr = (IntPtr)((int)currentPtr + Marshal.SizeOf(button));

そしてそれを

 currentPtr = (IntPtr)(currentPtr.ToInt64() + Marshal.SizeOf(button));
于 2012-08-21T19:35:15.263 に答える