Open Sesame 2020-04-20 20:56 采纳率: 0%
浏览 258

Win32编程,怎么运行指定的cmd命令并保存命令输出结果呢?

从网上找了段代码,但是并没有获得结果。
目的是要运行”cmd.exe /c PECheck.exe 指定文件“这样的命令。

wsprintf(cmdline, TEXT("cmd.exe /c PECheck.exe %s"), szFilePath);

SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

if (!CreatePipe(&hRead, &hWrite, &sa, 0)) {
    DWORD ret = GetLastError();
    return ret ? ret : -1;
}

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

if (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, NULL,
    NULL, NULL, &si, &pi)) {
    DWORD ret = GetLastError();
    CloseHandle(hRead);
    CloseHandle(hWrite);
    return ret ? ret : -1;
}

CloseHandle(hWrite);
DWORD bytesRead;
while (true) {
    if (!ReadFile(hRead, buffer, 1024, &bytesRead, NULL)) break;
    Sleep(100);
}

DWORD exitCode = 0;
GetExitCodeProcess(pi.hProcess, &exitCode);

CloseHandle(hRead);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

SetDlgItemText(hwnd, IDC_PACKTYPE, buffer);
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 13:55
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这是一个使用C语言编写的简单示例,用于在Windows应用程序中执行cmd.exe /c PECheck.exe 指定文件命令。这个例子首先创建两个管道(CreatePipe()),然后打开一个新进程来执行PE检查命令,并将命令的输出写入到管道中。最后,程序读取管道中的数据直到它被关闭或读取完毕。

    #include <windows.h>
    #include <stdio.h>
    
    #define BUFFER_SIZE 1024
    
    void ReadCommandOutput(HANDLE pipe, char *buffer, int bufferSize)
    {
        DWORD bytesReceived;
        while ((bytesReceived = ReadFile(pipe, buffer, bufferSize, &bytesReceived, NULL)) > 0)
        {
            printf("%s", buffer);
            buffer += bytesReceived;
        }
    }
    
    int main()
    {
        SECURITY_ATTRIBUTES sa;
        HANDLE hRead, hWrite;
        sa.nLength = sizeof(sa);
        sa.lpSecurityDescriptor = NULL;
        sa.bInheritHandle = TRUE;
    
        if (!CreatePipe(&hRead, &hWrite, &sa, 0))
        {
            DWORD ret = GetLastError();
            return ret ? ret : -1;
        }
    
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(si));
        GetStartupInfo(&si);
        si.hStdError = hWrite;
        si.hStdOutput = hWrite;
        si.wShowWindow = SW_HIDE;
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    
        if (!CreateProcess(NULL, (char *) "cmd.exe /c PECheck.exe ", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
        {
            DWORD ret = GetLastError();
            CloseHandle(hRead);
            CloseHandle(hWrite);
            return ret ? ret : -1;
        }
    
        CloseHandle(hWrite);
        DWORD bytesRead;
        ReadCommandOutput(hRead, buffer, BUFFER_SIZE);
        DWORD exitCode = 0;
        GetExitCodeProcess(pi.hProcess, &exitCode);
        CloseHandle(hRead);
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    
        SetDlgItemText(GetDlgItem(hwnd), IDC_PACKTYPE, buffer);
        return 0;
    }
    

    请注意,这段代码可能不适用于所有情况,特别是如果PECheck.exe是一个外部可执行文件,而不是命令行工具。此外,这个示例没有处理错误的情况,例如当读取管道失败时,或者当PE检查过程中出现错误时。

    如果你想要更复杂的功能,比如控制流,那么你可能需要使用更多的库函数和资源管理器。

    评论

报告相同问题?

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画