在不打开窗口的情况下在后台运行命令行命令

时间:2014-07-02 15:07:07

标签: c++ winapi background-process createprocess

我正在运行一些命令行脚本来使用AxCrypt软件加密文件。

我的代码编译并运行正常,但是当我之后检查文件时,它还没有加密。

以下是代码:

LPCWSTR loc = L"C:\\\\Axantum\\\\AxCrypt\\\\AxCrypt";

STARTUPINFOW si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if (CreateProcessW(loc, const_cast<LPWSTR>(master), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

主变量包含命令,loc包含AxCrypt程序的位置。

LPCWSTR axLocation = L" C:\\\\Axantum\\\\AxCrypt\\\\AxCrypt ";
LPCWSTR flags = L" -b 2 -e -k ";
LPCWSTR passcode = L" \"***************\" ";
LPCWSTR command = L" -z ";
LPCWSTR imagelocation = L"%pathName";
std::wstring mast = std::wstring(axLocation) + flags + passcode + command + imagelocation;
LPCWSTR master = mast.c_str();

1 个答案:

答案 0 :(得分:0)

LPCWSTR loc = L"C:\\\\Axantum\\\\AxCrypt\\\\AxCrypt";

这是错误的。你的文字中有太多的斜杠。它需要是这样的:

LPCWSTR loc = L"C:\\Axantum\\AxCrypt\\AxCrypt";

axLocation相同。

此外,您的各种子字符串中都有不必要的空格。最后,您将从解释器的角度创建此master命令行:

 C:\\Axantum\\AxCrypt\\AxCrypt  -b 2 -e -k  "***************"  -z %pathName

当看起来应该更像这样:

 C:\Axantum\AxCrypt\AxCrypt -b 2 -e -k "***************" -z %pathName

尝试更像这样的东西:

LPCWSTR axLocation = L"C:\\Axantum\\AxCrypt\\AxCrypt";
LPCWSTR flags = L"-b 2 -e -k";
LPCWSTR passcode = L"***************";
LPCWSTR command = L"-z";
LPCWSTR imagelocation = L"%pathName";
WCHAR master[STRSAFE_MAX_CCH];
StringCchPrintfW(master, STRSAFE_MAX_CCH, L"\"%s\" %s \"%s\" %s %s", axLocation, flags, passcode, command, imagelocation);

STARTUPINFOW si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if (CreateProcessW(axLocation, master, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

最后,%pathname看起来很可疑。是应该像那样指定吗?或者它应该是一个环境变量呢?如果是后者,则缺少百分号:

%pathname%

CreateProcess()不解释环境变量,所以如果你需要传递这样一个变量,那么你必须要么:

  1. 在致电ExpandEnvironmentStrings()之前使用CreateProcess()自行解决变量。

  2. CreateProcess()启动cmd.exe /C并让它为您解释环境变量,例如:

    StringCchPrintfW(master, STRSAFE_MAX_CCH, L"cmd /C \"%s\" %s \"%s\" %s %s", axLocation, flags, passcode, command, imagelocation);