1. ホーム
  2. c++

[解決済み] CreateProcessWがコマンドラインを無視する [重複] 。

2022-02-07 09:44:21

質問

ユーザーが別のプロセスでアプリケーションを起動できるように、DLL内にCreateProcessWを実装しようとしています。

手始めに、理解できるまでコードにコマンドをハードコードしています。

私は

STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPCTSTR AppName=L"c:\\utilities\\depends.exe";
LPTSTR Command = L"c:\\utilities\\tee.exe";
if (CreateProcessW(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi)) {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return GX_RESULT_OK;
    } else {
        .. show error msg
    }

これでDependsは起動しますが、Tee.exeは開きません。エラーはなく、コマンドラインパラメータが無視されるだけです。パラメータは正しく、実行プロンプトで実行しても問題なく動作します。AppNameを空白にし、Depends.exeをCommandパラメータとして指定しても動作しますが、次のように指定すると動作します。

LPTSTR Command = L"c:\\utilities\\depends.exe c:\\utilities\\tee.exe";

エラー3: "指定されたパスが見つかりません"が表示されます。

また、lpCurrentDirectoryパラメータを指定することで、同様に無視されます。

解決するには?

の中で実行ファイルを提供する必要があります。 command

  • Appname は実行ファイルへのフルパスを含む必要があります。
  • Command を含む必要があります。 argv[0]

ファイルを開きたい場合 t.txt をメモ帳で表示させるには、次のようにします。

  • Appname = "c:/windows/notepad.exe";
  • command = "notepad c:/temp/t.txt";

本当のプログラム名を入力する必要はなく、単なるプレースホルダーなので、偽名でもかまいません。

このように command = "fake c:/temp/t.txt";

今、notepad.exeで。

  • argv[0] = "notepad";
  • argv[1] = "c:/temp/t.txt";

この完全な例を参照してください。

#include <Windows.h>
#include <iostream>

using namespace std;

int main(){
    STARTUPINFO si = {sizeof(STARTUPINFO), 0};
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi = {0};
    LPTSTR AppName=L"C:/Windows/notepad.exe";
    wchar_t Command[] = L"notepad C:/Temp/t.txt"; 
    DWORD res = CreateProcess(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi);
    if (res) {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return 0;
    } else {
        cerr<<"error..."<<GetLastError()<<endl;
    }; 
    return 0;
}