.NET2005 MFC です。
やりたいことは、ShellExecuteでマイドキュメントの中のディレクトリを開き、
ファイルを別なディレクトリからコピペして、エクスプローラを閉じた後で、
FindNextFileとGetFileNameで、ディレクトリの中のファイル名を取得したいのですが、
そのままコーディングすると、エクスプローラを閉じる前に、ファイル名を読み取ってしまいます。
エクスプローラを閉じるまで、ファイル名の読み込みを待たせるには、どうしたらいいでしょうか。
隠しボタンを作って、ShellExecuteをその中に置き、Sendmessegeで処理させたらどうかと思ったのですが、やはり止まっていてくれません。
アドバイスをお願いします。
> ファイルを別なディレクトリからコピペして、エクスプローラを閉じた後で、
これって人間がする操作か?
> エクスプローラを閉じるまで、ファイル名の読み込みを待たせるには、どうしたらいいでしょうか。
ShellExecuteEx + WaitForSingleObject
か
CreateProcess + WaitForSingleObject
で待機できそうな。
http://www.sm.rim.or.jp/~shishido/cprocess.html
夏みかんさん、ありがとうこざいます。
リンクされたページに行ってみましたが、初心者で、正直、よく分かりませんでした。
「lpArgがコマンドライン」とのことですが、ここに何をいれたらいいのでしょうか。
_T("explorer.exe")ですと、ビルドは通りますが、実行すると、CreateProcessの行で、
ハンドルされていない例外が発生しました
というエラーになります。
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です。
explorerは設定しだいではプロセスが1つしか立ち上がらないようになっているので、新しいプロセスは既存のプロセスに処理を任せて即時終了してしまう場合があります。
そださん、シャノンさん、ありがとうございます。
そださんのコードで、例外が発生しなくなりました。
たいへんありがとうございますした。
> CreateProcess((LPTSTR)L"C:\\Windows\\explorer.exe",
ちなみにこれは安全ではありません。
# なんでキャストなんてするかなー
どうせなら下記のようにすべきです。
CreateProcess( _T( "C:\\Windows\\explorer.exe" ),
>CreateProcess( _T( "C:\\Windows\\explorer.exe" ),
コンソールのプロジェクトで試したせいか
プロジェクトの設定が悪いのか
ヘッダーが足りなかったのか
その _T()マクロはコンパイルが通らなかったんです。
キャストは夏みかんさんの参考URL元のソースを
深く吟味せずに変えたから残ってただけですたい。
申し訳ない。
ツイート | ![]() |