当前位置 博文首页 > KOOKNUT的博客:创建进程常见的方法
常见创建进程的几种方式:
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