C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: TaskDialog について


(過去ログ 14 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■4425 / inTopicNo.1)  TaskDialog について
  
□投稿者/ 雲 (1回)-(2007/06/17(Sun) 08:28:34)

分類:[C# (Windows)] 

Vista から、新たに追加になった TaskDialog の使い方を調べていたのですが、
ちょっと、不思議なことがあります。

C# から、TaskDialog を呼び出そうとしているのですが、

[DllImport("comctl32.dll", CharSet = CharSet.Unicode, EntryPoint="TaskDialog")]
static extern int _TaskDialog(
  IntPtr hWndParent,
  IntPtr hInstance,
  String pszWindowTitle,
  String pszMainInstruction,
  String pszContent,
  int dwCommonButtons,
  IntPtr pszIcon,
  out int pnButton);

これを定義しておけば、Windows Form を使ったときには、
単純に、

int p;
_TaskDialog( this.Handle, IntPtr.Zero, "123", "456", "789", 1, new IntPtr(UInt16.MaxValue), out p );

という呼び出しで、ダイアログが表示されるのですが、WPF を使ったときには、

  WindowInteropHelper helper = new WindowInteropHelper(this);

  int p;
  _TaskDialog( helper.Handle, IntPtr.Zero, "123", "456", "789", 1, new IntPtr(UInt16.MaxValue), out p );

同じように、呼び出すと、

『DLL 'comctl32.dll' の 'TaskDialog' というエントリ ポイントが見つかりません』

というエラーが表示されます。Windows Form で問題なく呼び出せているのに、なぜ、WPF を使うと
呼び出せなくなるのか?が、五里霧中です。

何か、Windows Form と WPF で DLL の呼び出し方に違いがあるのでしょうか?
※BEEP の呼び出しは、Windows Form と WPF で共通なのは確認しましたが。。。

引用返信 編集キー/
■4428 / inTopicNo.2)  Re[1]: TaskDialog について
□投稿者/ 雲 (2回)-(2007/06/17(Sun) 13:55:47)
2007/06/17(Sun) 13:57:19 編集(投稿者)

雲です。

いろいろと、試していましたが、どうやら、

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Runtime.InteropServices;
using System.Windows.Interop;


class TestMain
{
[STAThread]
public static void Main()
{
Application app = new Application();

app.Run( new TEST() );
}
}

class TEST : Window
{
[DllImport("comctl32.dll", CharSet = CharSet.Unicode,EntryPoint="TaskDialog")]
static extern int TaskDialog( IntPtr hwndParent, IntPtr hInstance, String pszWindowTitle, String pszMainInstruction, String pszContent, Int32 dwCommonButtons, IntPtr pszIcon, out int pnButton);

public TEST()
{
Width = 300;
Height = 300;

Button btn = new Button();
btn.Click += new RoutedEventHandler(btn_Click);

Content = btn;
}


void btn_Click(object sender, RoutedEventArgs e)
{
WindowInteropHelper helper = new WindowInteropHelper(this);

int p;
TaskDialog( helper.Handle, IntPtr.Zero, "123", "456", "789", 1, new IntPtr(UInt16.MaxValue), out p );
}
}

という書き方をするとダメみたいです。でも、この TEST クラスの記述が誤っているようには、
どうしても思えません。

何か、アドバイスを頂けるとうれしいのですが?

【環境】
Windows Vista
Visual Studio 2005 + SP1
引用返信 編集キー/
■4429 / inTopicNo.3)  Re[2]: TaskDialog について
□投稿者/ 雲 (3回)-(2007/06/17(Sun) 17:06:03)
自己レスです。

やっと、原因が判明しました。

[DllImport("comctl32.dll", CharSet = CharSet.Unicode,EntryPoint="TaskDialog")]

を使って、comctl32.dll をリンクしていたのですが、C ドライブを検索すると、
なんと、4つも comctl32.dll が入っていました。

で、system32 以下の comctl32.dll については、なんと、TaskDialog を含んでいない
ようです。

詳細は、よくわかりませんが、windows Form を使ったときには、なぜか、TaskDialog を
含んでいる DLL を選択していて、WPF を使った時には、TaskDialog を含まない DLL が
選択されているようです。

どうして、このような違いがあるのかわかりませんが、とりあえず、TaskDialog を含んでいる
と思われる DLL を直接フルパスで指定することで、何とか、無事に動作することに成功しました。

もし、このあたりの仕様をご存じの方がおられましたら、コメントを頂けると幸いです。


引用返信 編集キー/
■4430 / inTopicNo.4)  Re[3]: TaskDialog について
□投稿者/ 渋木宏明(ひどり) (235回)-(2007/06/17(Sun) 18:29:48)
渋木宏明(ひどり) さんの Web サイト
> なんと、4つも comctl32.dll が入っていました。

XP の頃から、comctl32.dll はシステム複数存在します。

どの dll を使用するかは manifest で指定します。

> で、system32 以下の comctl32.dll については、なんと、TaskDialog を含んでいない
> ようです。

正確なところは分かりませんが、v4 互換の comctrl32.dll には Vista で追加された API は含まれていない可能性はあります。

ですが

> 詳細は、よくわかりませんが、windows Form を使ったときには、なぜか、TaskDialog を
> 含んでいる DLL を選択していて、WPF を使った時には、TaskDialog を含まない DLL が
> 選択されているようです。

については、本来はそうであるべきでないし、そうなっていないはずだと思うんですが。。。どうしてそうなっちゃうんでしょうね。

manifest でわざわざ旧バージョンの comctrl32.dll を使用するように指定したりしてないですよね?


引用返信 編集キー/
■4431 / inTopicNo.5)  Re[4]: TaskDialog について
□投稿者/ 雲 (4回)-(2007/06/17(Sun) 18:39:11)
> XP の頃から、comctl32.dll はシステム複数存在します。

そうでしたか。これは、知りませんでした。。。

>>詳細は、よくわかりませんが、windows Form を使ったときには、なぜか、TaskDialog を
>>含んでいる DLL を選択していて、WPF を使った時には、TaskDialog を含まない DLL が
>>選択されているようです。
>
> については、本来はそうであるべきでないし、そうなっていないはずだと思うんですが。。。どうしてそうなっちゃうんでしょうね。
>
> manifest でわざわざ旧バージョンの comctrl32.dll を使用するように指定したりしてないですよね?

はい。manifest での指定は一切していないですし、全く同じプロジェクトで、WinForm から呼び出すものと、
WPF から呼び出すものを切り替えて試しているので、まさか、そんなこととは、露程も思いませんでした。

いや、正直、結構、悩みました。なぜこういうことが起こるのか?時間を見つけて調べてみようと思います。



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -