3

既存の実行可能ファイルを置き換える非常に単純なプログラムを作成しようとしています。引数を少し変えて、元のプログラムを新しい引数で実行する必要があります。サードパーティのライブラリによって自動的かつサイレントに呼び出されるはずです。

正常に実行されますが、コンソール ウィンドウがポップアップして、呼び出されたプログラムの出力が表示されます。そのコンソール ウィンドウが表示されないようにする必要があります。プログラムの出力は気にしません。

私の最初の試みはコンソール アプリケーションとして設定されていたので、同じことを行う新しい Windows GUI アプリを作成することでこれを修正できると考えました。しかし、それでもコンソールがポップアップします。元のコマンドはコンソール アプリケーションとしてマークされていると想定しているため、Windows は自動的に実行するコンソール ウィンドウを提供します。念のため、元の _exec() への呼び出しを system() への呼び出しに置き換えてみました。助け無し。

このコンソール ウィンドウを非表示にする方法を知っている人はいますか?

これが私のコードです:

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       char*    lpCmdLine,
                       int       nCmdShow)
{
    char *argString, *executable;
    // argString and executable are retrieved here

    std::vector< std::string > newArgs;
    // newArgs gets set up with the intended arguments here

    char const ** newArgsP = new char const*[newArgs.size() + 1];
    for (unsigned int i = 0; i < newArgs.size(); ++i)
    {
        newArgsP[i] = newArgs[i].c_str();
    }
    newArgsP[newArgs.size()] = NULL;

    int rv = _execv(executable, newArgsP);
    if (rv)
    {
        return -1;
    }
}
4

3 に答える 3

4

execve の代わりにCreateProcess関数を使用します。dwCreationFlags パラメータには、CREATE_NO_WINDOW フラグを渡します。コマンドラインも文字列として渡す必要があります。

例えば

STARTUPINFO startInfo = {0};
PROCESS_INFORMATION procInfo;
TCHAR cmdline[] = _T("\"path\\to\\app.exe\" \"arg1\" \"arg2\"");
startInfo.cb = sizeof(startInfo);
if(CreateProcess(_T("path\\to\\app.exe"), cmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &startInfo, &procInfo))
{
   CloseHandle(procInfo.hProcess);
   CloseHandle(procInfo.hThread);
}
于 2009-12-31T19:55:27.837 に答える
1

ああ、少なくとも .NET を使用する準備ができていれば、MSDNで答えを見つけたと思います。(本当はそうすべきではないと思いますが、今は無視します。)

 System::String^ command = gcnew System::String(executable);
 System::Diagnostics::Process^ myProcess = gcnew Process;
 myProcess->StartInfor->FileName = command;
 myProcess->StartInfo->UseShellExecute = false; //1
 myProcess->StartInfo->CreateNowindow = true;   //2
 myProcess->Start();

重要なのは //1 と //2 の 2 行です。両方が存在する必要があります。

ここで何が起こっているのか本当にわかりませんが、うまくいくようです。

于 2009-12-21T13:49:44.047 に答える
0

非コンソール アプリケーション (つまり、Windows GUI アプリ) を作成する必要があります。このアプリがファイルの処理などを行うだけの場合は、WinMain を使用したり、ウィンドウを登録したり、メッセージ ループを作成したりする必要はありません。コンソール アプリの場合と同じようにコードを記述するだけです。もちろん、printf などを使用することはできません。そして、それを実行するときは、system() ではなく、exec() ファミリーの関数を使用してください。

于 2009-12-21T11:15:43.973 に答える