L o a d i n g . . .
主打一个C++
文章详情

Windows系统C++中创建进程的不同方式

Posted on 2018-01-07 23:11:46 by 主打一个C++

1. 使用 CreateProcess 创建进程


void CreateProcessExample() {
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

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

    // 创建一个新进程来运行 notepad.exe
    if (CreateProcessA(NULL,   // 应用程序名称
                      (LPSTR)"notepad.exe", // 命令行参数
                      NULL,                // 进程句柄不可继承
                      NULL,                // 线程句柄不可继承
                      FALSE,               // 继承标志
                      0,                   // 创建标志(直接启动)
                      NULL,                // 使用调用进程的环境
                      NULL,                // 使用调用进程的当前目录
                      &si,                 // 指向 STARTUPINFO 结构的指针
                      &pi)                 // 指向 PROCESS_INFORMATION 结构的指针
        ) {
        std::cout << "CreateProcess 成功!" << std::endl;
        // 等待进程结束
        WaitForSingleObject(pi.hProcess, INFINITE);
        // 清理
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    } else {
        std::cout << "CreateProcess 失败,错误代码:" << GetLastError() << std::endl;
    }
}

2. 使用 ShellExecute 创建进程


void ShellExecuteExample() {
    HINSTANCE result = ShellExecute(NULL, "open", "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
    if ((intptr_t)result > 32) {
        std::cout << "ShellExecute 成功!" << std::endl;
    } else {
        std::cout << "ShellExecute 失败,错误代码:" << GetLastError() << std::endl;
    }
}

3. 使用 system 创建进程

// 使用 system 创建进程
void SystemExample() {
    int result = system("notepad.exe");
    if (result == 0) {
        std::cout << "system 成功!" << std::endl;
    } else {
        std::cout << "system 失败,错误代码:" << GetLastError() << std::endl;
    }
}

4. 较旧的方法,与ShellExecute类似

void WinExecExample() {
    UINT result = WinExec("notepad.exe", SW_SHOWNORMAL);
    if (result > 31) {
        std::cout << "WinExec 成功!" << std::endl;
    } else {
        std::cout << "WinExec 失败,错误代码:" << GetLastError() << std::endl;
    }
}

5. 使用 CreateProcessWithLogonW 这个函数允许在指定的用户凭据下创建一个新的进程

void CreateProcessWithLogonWExample(LPCWSTR applicationName = L"notepad.exe") {
    LPCWSTR username = L"Administrator"; //用户名
    LPCWSTR password = L"admins";       //密码
    LPCWSTR domain = L"DOMAIN";         //默认域
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

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

    BOOL success = CreateProcessWithLogonW(
        username,
        domain,
        password,
        LOGON32_LOGON_INTERACTIVE,
        applicationName,
        NULL, // 命令行,如果为 NULL,则使用 applicationName
        0,
        NULL, // 环境变量
        NULL, // 当前目录
        &si,
        &pi
    );

    if (success) {
        std::cout << "CreateProcessWithLogonW 成功!" << std::endl;
        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
    else {
        std::cout << "CreateProcessWithLogonW 失败,错误代码:" << GetLastError() << std::endl;
    }
}

6. 还有其他的一些:CreateProcessAsUser,NtCreateProcessEx,CoCreateInstance,Exec, ExecCommand,后两个更偏向于 Windows Scripting Host(WSH)等其他脚本环境,都不一一列举了。

*转载请注明出处:原文链接:https://cpp.vin/page/65.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog