Windows编程-通过一个程序打开另一个程序,CreateProcess参数详解

#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParameter);
int main(int argc, char* argv[])
{
    STARTUPINFO info;//info里面有巨多的参数,可以控制进程的信息,比如说是否全屏,是否显示程序在程序栏等等
    ZeroMemory(&info,sizeof(STARTUPINFO));
    info.cb = sizeof (STARTUPINFO);//Windows编程很多地方都需要初始化大小
    info.dwFlags = STARTF_RUNFULLSCREEN;
    PROCESS_INFORMATION si;

    //注意,实际的地址是只有 一个'\',但是这个在语言中需要转义字符,所以就成对出现
    if(!CreateProcess(L"H:\\AllCode\\Qt\\Windows-Study\\build-Windows16-test-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\\debug\\Windows16-test.exe",/*应用程序的名字以及全路径,只是名字,不能给程序传递参数*/
                  L"参数1 参数2",/*字符串,命令行字符串,可以没有命令行,可以用来给程序传递参数*/
                  NULL,/*一个指向SECURITY_ATTRIBUTES结构的指针,
                  这个结构体中最重要的是安全描述符,他决定了新产生的进程对象,
                  能否被其他子进程继承,这个进程对象,可以被哪些用户访问。
                  如果这个参数是NULL,那么产生的进程的进程对象不能被继承*/
                  NULL,/*一个指向SECURITY_ATTRIBUTES结构的指针,
                  是一个线程安全描述符,是指主线程的安全描述符
                  如果=NULL,表明新线程的句柄不能被继承*/
                  FALSE,/*产生的句柄可不可以被继承*/
                  CREATE_NEW_CONSOLE,/*创建标志,规定如何创建这个进程以及优先级
                  可以决定父进程和子进程是否同属一个框(有一个参数可以做到),
                  可以决定父进程和子进程是继承关系还是平行关系,
                  可以创建组群等,
                  可以指定计算机用哪个CPU*/
                  NULL,/*指向环境变量块*/
                  NULL,/*指向当前目录*/
                  &info,/*启动信息,一般是默认值*/
                  &si)/*可以用于后续的关闭*/)
    {
        int i = GetLastError();
        _tprintf(L"CreateProcess failue! %d\n",i);
    }
    else
    {
        _tprintf(L"CreateProcess sucess!\n");
    }
    cout << "waiting for child_process exit!" << endl;
    WaitForSingleObject(si.hProcess, INFINITE/*INFINITE:无限等待*/);
    //这个函数会阻塞程序运行,只有当si.Process进程退出后,这个函数才返回
    cout << "child_process exite" << endl;

    //进程内核对象代表一个进程,我们用一个进程句柄来访问进程
    //进程消失后,进程的内核对象可能会消失,也可能不会消失,但是进程不死,进程的内核对象一定不会消失
    //那什么时候销毁进程内核对象呢?当进程内核对象的引用计数为0时,才会销毁内核对象

    /*
     * 当进程退出的时候,进程的内核对象的状态会发生变化,我们把进程退出后,
     * 代表进程的内核对象的状态称为激发态。
     * 如果进程正在运行,那么代表进程内核对象的状态称为非激发态,
     * 此时,如果有类似WaitForSingleObject函数这样需要等待进程内核对象的话,
     * 这种函数会被阻塞,直到进程退出,进程内核对象处于激发态
*/
    if(!CloseHandle(si.hProcess))//直到调用这个函数,代表这个子进程的内核对象才可能被销毁
    {
        cout << "CloseHandle error! " << GetLastError() << endl;
    }



}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    cout << "Thread start" << endl;
    Sleep(2);//INFINITE无限
    cout << "Sleep" << endl;
    ExitProcess(-1);
    cout << "ExitProcess" << endl;
    return 0;
}

被打开的test程序:

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    for(int i = 0; i<argc; i++)
    {
        printf("%s\n",argv[i]);
    }
    getchar();
    return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 C++ 中,可以使用 CreateProcess 函数启动另一个程序CreateProcess 函数创建一个新的进程,并返回一个进程句柄和主线程句柄,可以使用这些句柄来控制新进程的执行。 示例代码如下: ``` #include <Windows.h> #include <iostream> using namespace std; int main() { // 要启动的程序路径 LPCTSTR lpApplicationName = TEXT("C:\\Windows\\System32\\notepad.exe"); // 命令行参数 LPTSTR lpCommandLine = NULL; // 进程属性 LPSECURITY_ATTRIBUTES lpProcessAttributes = NULL; LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL; BOOL bInheritHandles = FALSE; DWORD dwCreationFlags = 0; LPVOID lpEnvironment = NULL; LPCTSTR lpCurrentDirectory = NULL; LPSTARTUPINFO lpStartupInfo = new STARTUPINFO(); LPPROCESS_INFORMATION lpProcessInformation = new PROCESS_INFORMATION(); // 初始化 STARTUPINFO 结构体 ZeroMemory(lpStartupInfo, sizeof(STARTUPINFO)); lpStartupInfo->cb = sizeof(STARTUPINFO); // 启动进程 if (!CreateProcess(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)) { cout << "CreateProcess failed, error code: " << GetLastError() << endl; return 1; } cout << "Process started, process ID: " << lpProcessInformation->dwProcessId << endl; // 关闭句柄 CloseHandle(lpProcessInformation->hProcess); CloseHandle(lpProcessInformation->hThread); delete lpStartupInfo; delete lpProcessInformation; return 0; } ``` 注意,如果需要以管理员权限启动程序,则需要将 lpStartupInfo 参数中的 dwFlags 成员设置为 STARTF_USESHOWWINDOW,并将 wShowWindow 成员设置为 SW_SHOWNORMAL,这样程序启动后就会显示出 UI 界面。如果需要启动的程序一个服务,则需要使用 OpenSCManager 和 OpenService 函数打开服务,然后使用 StartService 函数启动服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子砰砰枪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值