前提・実現したいこと
C++でコマンドプロンプトのcopyを複数回使用したいと思っています。
system関数ではコピーのたびにコンソール画面が表示されるため、CreateProcess関数を使いコンソール画面を非表示にしたいのですが、処理が行われません。
解決方法を教えていただけないでしょうか。
発生している問題・エラーメッセージ
CreateProcess()がfalseになる
該当のソースコード
C++
1// srcPath: コピー元のフルパス 2// dstPath: コピー先のフルパス 3bool copy(CString srcPath, CString dstPath) 4{ 5 CString cmd; 6 cmd.Format(_T("copy \"%s\" \"%s\""), srcPath, dstPath); 7 8 STARTUPINFO si = {}; 9 PROCESS_INFORMATION pi = {}; 10 GetStartupInfo(&si); 11 12 ZeroMemory(&si, sizeof(STARTUPINFO)); 13 si.cb = sizeof(STARTUPINFO); 14 si.dwFlags = STARTF_USESHOWWINDOW; 15 si.wShowWindow = SW_HIDE; 16 17 bool res = CreateProcess( 18 NULL, // 実行可能モジュールの名前 19 cmd.GetBuffer(0), //コマンドライン文字列 20 NULL, // セキュリティ記述子 21 NULL, // セキュリティ記述子 22 FALSE, // ハンドルの継承オプション 23 0, // 作成のフラグ 24 NULL, // 新しい環境ブロック 25 NULL, // カレントディレクトリの名前 26 &si, // スタートアップ情報 27 &pi // プロセス情報 28 ); 29 30 if(!res) return false; 31}
試したこと
下記ではコピーが行われるたびにコンソール画面が立ち上がってしまい挙動が遅い。
C++
1std::string dq("\""); 2std::string srcCmd = "copy " + dq + src_path + dq + " " + dq + dst_path + dq; 3const char* cmd = srcCmd.c_str(); 4int ret = system(cmd);
補足情報(FW/ツールのバージョンなど)
windows10
visual studio 2017
文字セット:Unicode文字セットを使用する
Win32APIのCopyFile関数、C++17のfilesystem::copy_file関数はウイルスバスターの挙動監視に引っかかってしまい使用できませんでした。
「コマンドプロンプトのcopy」で行う必然性はありますでしょうか?

さきほど補足情報に文言を追加させていただきましたが、CopyFile関数やfilesystemクラスを使用するとウイルスバスターの挙動監視にひっかかり、アプリケーションが落とされてしまいます。
それはウイルスバスターが悪いです(一般的なパソコンで実行ファイルを作ることはまず行いませんので、自分のマシンでコンパイルを行うと誤認識が多発します)。

Releaseビルドを行い、exeから起動しても同じ現象が発生します。他の方法が思いつかず頓挫しています。
ウイルスバスターは会社のセキュリティ上、設定をいじれないためウイルスバスターをどうこうするは認められませんでした。
C++以外の言語を使う、という選択肢はありますか?

Visual C++ 6.0の移植という形でやっていますので、C++以外は色々と問題が発生しそうですね。。。
.batファイルじゃダメなんですか?
→https://www.atmarkit.co.jp/ait/articles/1506/26/news026.html
> コンソール画面が立ち上がってしまい挙動が遅い
遅い原因が、コンソール画面の表示だと、どういう根拠で判断しましたか?
外部コマンドを起動する(プロセス生成する)から遅いのでは?
CopyFileが引っかかるならSHFileOperationも駄目かな…?

>>cateye様
GUIアプリと作成しているためbatファイルは問題が発生してしまいます。

>>otn様
数値などを計測したわけではありませんので、単純にフォルダを目視してて体感で遅いと思っただけです。

>SHOMI様
ご回答ありがとうございます。SHFileOperationも試してみましたが同じくだめでした。
いまのところコマンドプロンプトのcopyのみウイルスバスターにひっかからず行えるようです。
> コンソール画面が立ち上がってしまい挙動が遅い
に根拠がなく、system("copy~”)で出来るなら、それで良いのでは?

直接CTRL+C, CTRL+Vでコピーを行う処理と比較すると3倍ほど時間がかかっていました。また、コンソール画面がコピーのたびに立ち上がり、そちらに触れるとアプリケーションが終了してしまいますので仕様してはよろしくないのであまりやりたくないというのが本音です。
>3倍ほど時間がかかって・・・コマンドを立ち上げて、コピーするのですから当然と思いますが?
batファイル中にcopy処理を記述し、そのbatファイルを呼び出すようにすれば、一度のコンソール画面表示のみで対応できるかと。
