隐藏英雄 发表于 2022-12-27 21:09

C++ 求助5

本帖最后由 隐藏英雄 于 2022-12-27 22:16 编辑

ShellExecute(0, "open", "cmd.exe", "/C ping 192.168.1.1 -n 20 > D:\\ping.t", 0, SW_HIDE);//这货是异步执行CMD 程序不会等待它,需要用WaitForSingleObject 但是不会用
想执在程序运行的过程中执行CMD命令,并且不弹黑窗,找了很多办法 觉得ShellExecute还可行,但是这货是异步执行CMD 程序不会等待它执行完毕以后再执行后面的代码,导致CMD输出的内容还没完整 它程序都执行完毕了。
找了很多网页 最靠谱的应该是用WaitForSingleObject 等待异步线程,但是这个涉及到了句柄什么的,我就不会写了,谁帮我个忙?
或者有什么简单一点的CMD执行命令隐藏黑窗,而且等CMD执行完毕再继续执行其他代码的方法?

yushiwen 发表于 2022-12-27 21:24

您可以使用 CreateProcess 函数来执行 CMD 命令,并且等待执行完毕后继续执行其他代码。
下面是一个示例代码#include <Windows.h>
#include <iostream>

int main()
{
    // 创建一个新的进程
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // 在新进程中执行 CMD 命令
    const char* command = "cmd.exe /C ping 192.168.1.1 -n 20 > D:\\ping.txt";
    if (!CreateProcess(NULL, const_cast<char*>(command), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
      std::cerr << "CreateProcess failed: " << GetLastError() << '\n';
      return 1;
    }

    // 等待进程结束
    WaitForSingleObject(pi.hProcess, INFINITE);

    // 关闭句柄
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    std::cout << "CMD command finished\n";

    return 0;
}


在这段代码中,使用 CreateProcess 函数创建了一个新的进程,并在新进程中执行了 CMD 命令。然后使用 WaitForSingleObject 函数等待新进程结束,最后关闭句柄。这样就可以保证 CMD 命令在程序中执行完毕后再继续执行其他代码。

请注意,在使用 CreateProcess 函数时需要包含 Windows.h 头文件。

RainPPR 发表于 2022-12-27 21:18

system("start /min /wait cmd");
cmd那块可以加指令或运行个bat什么的
编译不了加system.h头文件

DEATHTOUCH 发表于 2022-12-27 21:42

或者你写一个回调然后CreateThread,用WaitForSingleObject等这个线程
或者也可以用ShellExecuteEx然后用WaitForSingleObject等

隐藏英雄 发表于 2022-12-27 21:43

本帖最后由 隐藏英雄 于 2022-12-27 21:50 编辑

yushiwen 发表于 2022-12-27 21:24
您可以使用 CreateProcess 函数来执行 CMD 命令,并且等待执行完毕后继续执行其他代码。
下面是一个示例代 ...
此方法看起来非常不错,        si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
增加这2句就可以隐藏黑窗了

ytfrdfiw 发表于 2022-12-28 12:01

学习一下。

qylisten 发表于 2022-12-28 17:37

本帖最后由 qylisten 于 2022-12-28 17:39 编辑

RainPPR 发表于 2022-12-27 21:18
cmd那块可以加指令或运行个bat什 ...system("cmd.exe /C ping 192.168.1.1 -n 2 > D:\\ping.txt");
亲测,这个可以!无窗口。
页: [1]
查看完整版本: C++ 求助5