ShellExecuteEx関数の使い方について

このQ&Aのポイント
  • FTPで実行するコマンド定義ファイルを作成し、自動化する方法について
  • ShellExecuteEx関数とWaitForSingleObject関数を使用してFTPの終了を待つ方法について
  • system関数とShellExecuteEx関数の比較とFTPの実行に関する疑問点について
回答を見る
  • ベストアンサー

ShellExecuteEx関数の使い方について

環境 VC6++/WindowsXP やりたい事 ・FTPで実行するコマンド定義ファイルを作成(コマンドは都度変わる) ・FTPを自動化するために-sオプションをつけ上記ファイル指定して実行 ・その(FTP)結果をリダイレクトしてファイルに落とす ・FTPの終了待ってコマンド定義ファイルを削除 ・できればDOS窓を出したくない 上記を行うために次の様なコードを書きました sei.nShow = SW_SHOWNORMAL; sei.fMask = SEE_MASK_FLAG_DDEWAIT; ShellExecuteEx(&sei); WaitForSingleObject(sei.hProcess, INFINITE); FTPは動作するのですが実際の動作完了前に次の行に実行が移ってしまいます (FTPは最後にquitします) 何か足りないことがあるのでしょうか? 当初system関数使いましたがDOS窓開くのがうっとおしいため ShellExecuteExに変更しました system関数ではDOS窓は出ますが完了まで戻ってきません 何かやらなければいけないことが足りないのか どうあがいてもできないのか(FTPだから?)が判断付きません どなたか詳しい方教えていただけないでしょうか ※ 極論言えば目的が達成できればどんな形でもいいので   関数変えればできるでもいいです

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ShellExecuteEx実行後のsei.hProcessが0になっていませんか? fMaskに指定されているDDEWAITはこの場合は関係ないのではないでしょうか。 NOCLOSEPROCESSを指定してみてはどうでしょう。

koi1234
質問者

お礼

>ShellExecuteEx実行後のsei.hProcessが0になっていませんか? そのとおりです >fMaskに指定されているDDEWAITはこの場合は関係ないのではないでしょうか。 セットしてもしなくても同じだったのでおそらく関係ないと思います >NOCLOSEPROCESSを指定してみてはどうでしょう。 これを行うことでsei.hProcessに値が入り 思い道理の動きになることを確認できました ありがとうございました

関連するQ&A

  • 外部exe呼び出しの方法 ShellExecuteEx, System...

    VC++6での質問す。 ◆やりたいこと◆ (1)内部から外部exeを引数ありで呼び出し、処理をさせます。 (2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。 (3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。 system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。 ◆やってみた方法◆ こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。 ↓ SHELLEXECUTEINFO sei; DWORD dwRC; LPVOID msg; BOOL res; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.nShow = SW_HIDE; sei.lpVerb = (LPCTSTR)cmd; // cmdの中は、"hoge.exe param1 param2" res=ShellExecuteEx( &sei ); WaitForSingleObject( sei.hProcess, INFINITE ); GetExitCodeProcess( sei.hProcess, &dwRC ); CloseHandle(sei.hProcess); if(res != FALSE){ MessageBox( "OK", "result", MB_OK ); }else{ FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwRC, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &msg, 0, NULL ); MessageBox( msg, "result", MB_OK | MB_ICONERROR ); LocalFree(msg); } 以上で実行しようとすると、 「指定されたファイルに対してこの操作を行うアプリケーションが関連付けられていません・・・」 のエラーになってしまいます。 どのように改善していけばよいでしょうか。 ソースはあちこちのものをミックスして書いていて、半分意味も分からずで、とんでもないことをしているかも知れません(VCは初心者で、ハンドルとかクラス、プロセスとかの知識に乏しいです) また、まったく別で良い方法(CreateProcessの方が簡単だとか)があれば、よろしくお願いします。

  • C言語でPDFファイルのサイズと位置を変更したい

    PDFのファイルをサイズと位置を指定して開きたいのですがうまく行きません、 良い方法はありませんか? 現在のコード //v8.3 PDFのファイルのサイズと位置を変更 BOOL MovePDF(LPCTSTR lpszCloseFile) { CWnd* pWnd; CString str = lpszCloseFile; //v8.2 ウィンドウを検索してハンドルの取得 pWnd = FindWindow("AcrobatSDIWindow", str + " - Adobe Reader"); if (pWnd != NULL){ //v8.3 見つかったウィンドウのサイズと位置を変更(x,y,widh,height) pWnd->MoveWindow(0, 0, 600, 600); return TRUE; } else MessageBox("ウィンドウハンドルが取得できませんでした。"); return FALSE; } //v7.4 レイアウト図作成手順表示 BOOL MakeLayout1() { int ret; CString strFileName; strFileName = m_cFunc.GetInitDir() + "\\PDF\\レイアウト図作成手順1.pdf"; SHELLEXECUTEINFO sei = { 0 }; //構造体のサイズ sei.cbSize = sizeof(SHELLEXECUTEINFO); //起動側のウインドウハンドル sei.hwnd = m_hWnd; //起動後の表示状態 sei.nShow = SW_SHOWNORMAL; //このパラメータが重要で、セットしないとSHELLEXECUTEINFO構造体のhProcessメンバがセットされない。 sei.fMask = SEE_MASK_NOCLOSEPROCESS; //起動プログラム sei.lpFile = strFileName; //プロセス起動 if(!ShellExecuteEx(&sei) || (const int)sei.hInstApp <= 32){ TRACE("error ShellExecuteEx\n"); } else { //v8.3 入力可能状態になるまで待つ WaitForInputIdle(sei.hProcess, INFINITE); } //v8.3 サイズと位置変更 MovePDF("レイアウト図作成手順1.pdf"); return TRUE; }

  • ShellExecuteExでハンドルの取得

    ここで教えて頂きhpを見ながら 下記のようにしてみましたが hProcessからハンドルが取れません エクスプローラは立ち上がりますし わざとエラーを起こさせても返ってきます でもハンドルは取れません 宜しくお願いいたします SHELLEXECUTEINFO shellexe; HANDLE shellexehandle; memset( &shellexe, 0, sizeof(SHELLEXECUTEINFO) ); shellexe.cbSize = sizeof(SHELLEXECUTEINFO); shellexe.fMask = SEE_MASK_NOCLOSEPROCESS; shellexe.hwnd = HWND_DESKTOP; shellexe.lpVerb = "explore"; shellexe.lpFile = "C:\\"; shellexe.lpParameters = NULL; shellexe.lpDirectory = NULL; shellexe.nShow = SW_SHOWNORMAL; ShellExecuteEx( &shellexe ); hShell = shellexe.hInstApp; shellexehandle = shellexe.hProcess;

  • FTP関数について

    FTP関数についての質問です。 自分のHPからFTPを用いてファイルをダウンロードできるように したいため、FTPサーバに接続してファイルをダウンロードさせる ロジックを作ったのですが、うまくいきません。 というのは、私の作ったFTP処理では、サーバ上で実行されるので、 呼び出し元がサーバになり、ファイルはサーバ上にダウンロード されてしまうのです。 そこで質問なのですが、 PHPのFTP関数は、クライアントからプログラムを実行しないと クライアント側にファイルはダウンロードされないのでしょうか?

    • ベストアンサー
    • PHP
  • DOS上で、UNIXのShellに代替されるものってありますか?

    あるPCから別のマシンにftpを使ってファイルを転送するのですが、作業者(ファイル転送をする人)がftpコマンドなどが使えないため、 パソコンのDOS画面(コマンド実行)から、キーをひとつたたけば、ファイル転送してくれる仕組みをつくりたいのです。(ファイル名は固定のものが数個。転送するのは1ファイル単位でまとめての転送はしない) UNIX上ならftpコマンドを発行するシェルを作れば済むと思うのですが、DOS上ではどうなのでしょうか? UNIXのシェルのようなものはあるのでしょうか?

  • system関数を使用時にDos窓を最小化したい

    VC5.0でsystem関数を使用して処理を実行しています。 system関数を使用するとDos窓が表示されますが、 そのDos窓を最小化するにはどうしたら良いですか?

  • アプリケーションが終了するまで待機

    SHELLEXECUTEINFO shellinfo; ZeroMemory(&shellinfo, sizeof(SHELLEXECUTEINFO)); shellinfo.cbSize = sizeof(SHELLEXECUTEINFO); shellinfo.lpVerb = "open"; shellinfo.lpFile = "test.htm"; shellinfo.nShow = SW_SHOW; shellinfo.hwnd = this->m_hWnd; shellinfo.fMask = SEE_MASK_NO_CONSOLE | SEE_MASK_NOCLOSEPROCESS; WaitForSingleObject(shellinfo.hProcess,INFINITE); ShellExecuteEx(&shellinfo); 上記のようなソースでShellExecuteEXでhtmlファイルを アプリケーション(インターネットエクスプローラ)で開き WaitForSingleObjectでアプリケーションが終了するまで待機させておきたいのですが うまくいきません。txtファイルでメモ帳ならうまくできるのですが なぜでしょうか。なにか情報ありましたらお願い致します。

  • ShellExecuteExでスペースを含む引数を渡すには?

    すみません。 ShellExecuteEx関数を使用して、コマンドラインで実行していた実行ファイルを起動させたいのですが、実行ファイルに渡す引数にスペースが含まれると、ペースの前までか渡せないのですが、スペースを含む引数を渡す方法を御存知ないでしょうか? (詳細) コマンドライン(cmd.exe)では”○○○.exe 引数1 引数2 引数3(リターン)”で実行しているのですが、ShellExecuteEx("○○○.exe", "引数1 引数2 引数3”, NULL, ・・・・, SW_SHOW); のような形で作成して実行すると、引数1までで○○○.exeが実行されてしまい、スペースを挟んだ引数2以降が渡せていません。 スペースを挟んだ引数を渡す方法を御存知ないでしょうか? すみません。

  • DOS窓の非表示

    環境:Windows2000,BorlandC++Builder6 system()関数によりDOS上で動く実行ファイルの呼び出し をしています。その際,DOS窓が一瞬出ます。 どうにかDOS窓が出ないようにしたいのですが, 何か方法はないでしょうか? どなたか分かりましたら教えて下さいm(__)m

  • バッチファイルで無限ループ

    以下の1行だけを書いたバッチファイルを作って、ダブルクリックすると書いたコマンドがDOS窓で無限に実行されてどんどんスクロールしていきます。 route add 172.22.0.0 mask 255.255.0.0 192.168.75.2 metric 1 あらかじめDOS窓を開いておいてこのバッチファイルをドロップすれば正しく実行されるのですが、何故この様なことになるのでしょうか。

専門家に質問してみよう