当前位置 博文首页 > KOOKNUT的博客:创建进程常见的方法

    KOOKNUT的博客:创建进程常见的方法

    作者:[db:作者] 时间:2021-07-02 21:26

    常见创建进程的几种方式:
    WinExec

    UINT WinExec(
      LPCSTR lpCmdLine,  // command line
      UINT uCmdShow      // window style
    );
    

    测试:

    	/*****************************************
    	*WinExec运行指定的应用程序
    	*lpCmdLine:命令行参数,如果名称中不包含可执行文件路径,则按照以下顺序查找
    	*exe启动路径--当前目录--Windows系统目录--Windows目录--环境变量
    	*uCmdShow:窗口状态
    	******************************************/
    	WinExec("notepad.exe", SW_SHOW);
    

    ShellExecute

    SHSTDAPI_(HINSTANCE) ShellExecuteA(_In_opt_ HWND hwnd, _In_opt_ LPCSTR lpOperation, _In_ LPCSTR lpFile, _In_opt_ LPCSTR lpParameters,
        _In_opt_ LPCSTR lpDirectory, _In_ INT nShowCmd);
    SHSTDAPI_(HINSTANCE) ShellExecuteW(_In_opt_ HWND hwnd, _In_opt_ LPCWSTR lpOperation, _In_ LPCWSTR lpFile, _In_opt_ LPCWSTR lpParameters,
        _In_opt_ LPCWSTR lpDirectory, _In_ INT nShowCmd);
    

    测试:

    	/*****************************************
    	*hwnd:指向父窗口的窗口句柄
    	*lpOperation:为要执行操作的字符串指针,可以为open,print,find,explore和edit等值之一。
    	*lpFile:以NULL结束的字符串地址,可以是可执行文件或者普通文件名
    	*lpParameters:如果lpFile是可执行文件,则此值可以为以NULL结束的字符串地址,如果lpFile
    	*为文档文件,则此值为NULL
    	*lpDirectory:指定默认路径
    	*nShowCmd:指定如何显示
    	******************************************/
    	ShellExecute(NULL, _T("open"), _T("notepad.exe"), _T("Hello.txt"), NULL, SW_SHOW);
    	ShellExecute(NULL, _T("open"), _T("Hello.txt"),NULL, NULL, SW_SHOW);
    

    ShellExecuteEx

    WINSHELLAPI BOOL WINAPI ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo );
    
    typedef struct _SHELLEXECUTEINFO { 
    DWORD cbSize;
     ULONG fMask; 
     HWND hwnd; 
     LPCSTR lpVerb; 
     LPCSTR lpFile; 
     LPCSTR lpParameters;
     LPCSTR lpDirectory; 
     int nShow;
     HINSTANCE hInstApp;
      // Optional members LPVOID lpIDList; 
     LPCSTR lpClass;
     HKEY hkeyClass;
     DWORD dwHotKey;
     HANDLE hIcon; 
     HANDLE hProcess; 
    } SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO; 
    

    测试:

    	/*****************************************
    	*cbSize:指向父窗口的窗口句柄
    	*fMask:标志,有两种SEE_MASK_NOCLOSEPROCESS、SEE_MASK_FLAG_NO_UI
    	*hwnd: 窗口句柄
    	*lpVerb:为要执行操作的字符串指针,可以为open,print,find,explore和edit等值之一。
    	*lpFile:以NULL结束的字符串地址,可以是可执行文件或者普通文件名
    	*lpParameters:如果lpFile是可执行文件,则此值可以为以NULL结束的字符串地址。
    	*lpDirectory:指定默认路径
    	*nShowCmd:指定如何显示
    	*hInstApp:实例句柄
    	*hProcess:如果fMask是SEE_MASK_NOCLOSEPROCESS,则在这里可以得到新启动程序的句柄
    	******************************************/
    	SHELLEXECUTEINFO ShellExeCuteInfo;
    	memset(&ShellExeCuteInfo, 0, sizeof(SHELLEXECUTEINFO));
    	ShellExeCuteInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    	ShellExeCuteInfo.lpVerb = _T("open");
    	ShellExeCuteInfo.lpFile = _T("notepad.exe");
    	ShellExeCuteInfo.lpParameters = NULL;
    	ShellExeCuteInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    	ShellExeCuteInfo.nShow = SW_SHOWDEFAULT;
    	ShellExecuteEx(&ShellExeCuteInfo);
    

    最常见的CreateProcess

    CreateProcess:CreateProcess函数创建一个新进程及其主线程。新进程在调用进程的安全上下文中运行指定的可执行文件。
    BOOL CreateProcess(
      LPCTSTR lpApplicationName,                 // name of executable module
      LPTSTR lpCommandLine,                      // command line string
      LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
      LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
      BOOL bInheritHandles,                      // handle inheritance option
      DWORD dwCreationFlags,                     // creation flags
      LPVOID lpEnvironment,                      // new environment block
      LPCTSTR lpCurrentDirectory,                // current directory name
      LPSTARTUPINFO lpStartupInfo,               // startup information
      LPPROCESS_INFORMATION lpProcessInformation // process information
    );
    

    测试:

    void Sub_1()
    {
    	//子进程的名称
        TCHAR* ApplicationName = _T("Test.exe");
    	STARTUPINFO StartupInfo;
        PROCESS_INFORMATION ProcessInfo;
    	BOOL IsOk = FALSE;
    
    	//清空结构体的内存
        ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
    	StartupInfo.cb = sizeof(STARTUPINFO);
    	ZeroMemory(&ProcessInfo, sizeof(PROCESS_INFORMATION));
    	//创建子进程
    	IsOk = CreateProcess(ApplicationName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE ,NULL,NULL, &StartupInfo, &ProcessInfo);
    	DWORD LastError = GetLastError();
    	if (!IsOk)
    	{
    		_tprintf(_T("CreateProcess failed\n"));
    		return;
    	}
    	//等待直到子进程退出
    	WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    	// 关闭进程和线程句柄
    	if (ProcessInfo.hThread != NULL)
    	{
    		CloseHandle(ProcessInfo.hThread);
    		ProcessInfo.hThread = NULL;
    	}
    	if (ProcessInfo.hProcess != NULL)
    	{
    		CloseHandle(ProcessInfo.hProcess);
    		ProcessInfo.hProcess = NULL;
    	}
    }
    

    “You are fully capable of deciding your own destiny.”

    cs