文章详情
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