ファイルコモンダイアログを「開く」ボタンで閉じた後ShellExecuteを正常に動作させるには?

解決


田中  2009-08-17 23:58:14  No: 70800

田中と申します。WinXP + VC++6.0(MFC)でプログラムを行っています。

アプリ作成中に問題が生じたため、問題を絞り込むため以下のようなダイア
ログベースのテスト確認プログラムを作成しました。

///////////////////////////////////////////////////////////////////

ボタンをクリックすることによりファイルコモンダイアログを開かせる(本体
のダイアログが小さいのでファイルコモンダイアログの後ろに本体のダイア
ログ全体が隠れます)。
本体のダイアログにLButtonDownメッセージハンドラを追加し、その中でAPI
のShellExecuteを使ってファイル(test.txt)を開かせる。

void CTestXDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
  // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
  
    ::ShellExecute(NULL, "Open", "test.txt", NULL, NULL, 3);

    CDialog::OnLButtonDown(nFlags, point);
}

void CTestXDlg::OnButton1() 
{
  // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
  
    CFileDialog dlgFile(TRUE);
    dlgFile.DoModal();
}

//////////////////////////////////////////////////////////////////

上記のプログラムで確認したところ次のような結果が生じました。

ファイルコモンダイアログを開かずに本体をクリックした場合や、コモンダ
イアログを開いてキャンセルボタンで閉じた後に本体をクリックした場合に
はSellExecuteで指定したファイルが開く。

ファイルコモンダイアログを開いて、その中で任意のファイルを選択して「開く」ボタンで
コモンダイアログを閉じた後に本体をクリックした場合にはSellExecuteで指
定したファイルは開かない。

ShellExecuteの代わりに複数のAPI(PostMessage等)で試したところ、すべて
正常に動作しました。
また、ファイルの種類も変えて見ましたがやはり開けませんでした。

なぜ、ファイルを選択した後「開く」ボタンで閉じた時にShellExecuteの場合
だけ上記のような結果になるのか、また、その解決法についてアドバイスを
いただければ幸いです。
よろしくお願いいたします。


Blue  2009-08-18 00:03:29  No: 70801

ファイルを開くダイアログで「カレントディレクトリが変更される」からでは?

>::ShellExecute(NULL, "Open", "test.txt", NULL, NULL, 3);
フルパスにしたら開くのでは?
(test.txtがexeと同じディレクトリにあるのであれば、GetModuleFileNameあたりのAPIから
フルパスを作成するとか)


田中  2009-08-18 03:09:48  No: 70802

Blueさん、Resをありがとうございます。

ご指摘のとおりにフルパスを設定してやるとアッサリと成功しました。
ファイル名を指定するような場合に上手くいかないときは常にフルパスを設
定してみるべきなのだということが分かりました。

勉強になりました、どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加