ShellExecuteで、エクスプローラが閉じるまで処理を待たせるには

解決


松井イチロー  2008-04-26 17:21:45  No: 68172

.NET2005 MFC です。

やりたいことは、ShellExecuteでマイドキュメントの中のディレクトリを開き、
ファイルを別なディレクトリからコピペして、エクスプローラを閉じた後で、
FindNextFileとGetFileNameで、ディレクトリの中のファイル名を取得したいのですが、

そのままコーディングすると、エクスプローラを閉じる前に、ファイル名を読み取ってしまいます。

エクスプローラを閉じるまで、ファイル名の読み込みを待たせるには、どうしたらいいでしょうか。

隠しボタンを作って、ShellExecuteをその中に置き、Sendmessegeで処理させたらどうかと思ったのですが、やはり止まっていてくれません。

アドバイスをお願いします。


夏みかん  2008-04-27 00:27:22  No: 68173

> ファイルを別なディレクトリからコピペして、エクスプローラを閉じた後で、
これって人間がする操作か?

> エクスプローラを閉じるまで、ファイル名の読み込みを待たせるには、どうしたらいいでしょうか。
ShellExecuteEx + WaitForSingleObject

CreateProcess + WaitForSingleObject
で待機できそうな。

http://www.sm.rim.or.jp/~shishido/cprocess.html


松井イチロー  2008-04-27 02:52:47  No: 68174

夏みかんさん、ありがとうこざいます。

リンクされたページに行ってみましたが、初心者で、正直、よく分かりませんでした。

「lpArgがコマンドライン」とのことですが、ここに何をいれたらいいのでしょうか。
_T("explorer.exe")ですと、ビルドは通りますが、実行すると、CreateProcessの行で、

ハンドルされていない例外が発生しました

というエラーになります。


そだ  2008-04-27 07:11:52  No: 68175

MSDNに反してアプリケーション名にNULL指定すると動かないですね。
プロセス立ち上げるだけなら、
  CreateProcess((LPTSTR)L"C:\\Windows\\explorer.exe",NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,
    NULL,NULL,&si,&pi);
でできます。explorer.exeは場合によっては違うところにあるかもしれませんが。
しかもWaitForSingleObjectでは立ち上がったexplorer.exeに
SYNCHRONIZE権限がないので止められません。

環境依存かもしれません。ちなみにVistaです。


シャノン  2008-04-27 10:10:17  No: 68176

explorerは設定しだいではプロセスが1つしか立ち上がらないようになっているので、新しいプロセスは既存のプロセスに処理を任せて即時終了してしまう場合があります。


松井イチロー  2008-04-27 17:22:50  No: 68177

そださん、シャノンさん、ありがとうございます。

そださんのコードで、例外が発生しなくなりました。

たいへんありがとうございますした。


RAPT  URL  2008-05-02 10:11:39  No: 68178

> CreateProcess((LPTSTR)L"C:\\Windows\\explorer.exe",
ちなみにこれは安全ではありません。
# なんでキャストなんてするかなー

どうせなら下記のようにすべきです。
CreateProcess( _T( "C:\\Windows\\explorer.exe" ),


そだ  2008-05-02 21:27:37  No: 68179

>CreateProcess( _T( "C:\\Windows\\explorer.exe" ),

コンソールのプロジェクトで試したせいか
プロジェクトの設定が悪いのか
ヘッダーが足りなかったのか
その _T()マクロはコンパイルが通らなかったんです。

キャストは夏みかんさんの参考URL元のソースを
深く吟味せずに変えたから残ってただけですたい。

申し訳ない。


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

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






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