前言
用户层微软提供了WinExec、ShellExecute、CreateProcess等函数创建进程,也可以执行cmd命令等。
函数介绍
WinExec函数
运行指定的应用程序。
语法
UINT WinExec(
[in] LPCSTR lpCmdLine,
[in] UINT uCmdShow
);
参数
[in] lpCmdLine
要执行的应用程序的命令行。
[in] uCmdShow
显示选项。
返回值
如果函数成功,则返回值大于 31。
否则函数失败。
ShellExecute函数
运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。
语法
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
参数
hwnd
显示UI或错误消息的父窗口句柄。
lpOperation
指向以空字符结尾的字符串的指针,用于指定要执行的操作。
lpFile
指向以空字符结尾的字符串的指针,执行指定的文件或对象。
lpParameters
如果lpFile是一个可执行文件,此参数为传递给应用程序的参数。
lpDirectory
该字符串指定操作的默认目录。
nShowCmd
指定应用程序打开时如何显示标志。
返回值
如果函数成功,则返回值大于 32。
否则函数失败。
CreateProcess函数
该函数用于运行一个新程序。它创建一个新进程及其主线程。新进程运行指定的可执行文件。
语法
BOOL CreateProcess(
LPCWSTR pszImageName,
LPCWSTR pszCmdLine,
LPSECURITY_ATTRIBUTES psaProcess,
LPSECURITY_ATTRIBUTES psaThread,
BOOL fInheritHandles,
DWORD fdwCreate,
LPVOID pvEnvironment,
LPWSTR pszCurDir,
LPSTARTUPINFOW psiStartInfo,
LPPROCESS_INFORMATION pProcInfo
);
参数
pszImageName
指定要执行的模块。
pszCmdLine
指定要执行的命令行。
psaProcess
NULL。
psaThread
NULL。
fInheritHandles
FALSE。
fdwCreate
指定控制优先级和进程创建的附加标志。
pvEnvironment
NULL。
pszCurDir
NULL。
psiStartInfo
NULL。
pProcInfo
接受有关新进程的标识信息
返回值
如果函数成功,则返回值非零。
否则函数失败。
示例
程序代码
#include <iostream>
#include <windows.h>
//WinExec
BOOL winExec(const char* pszExePath)
{
UINT uiRet = WinExec(pszExePath, SW_SHOWNORMAL);
if (31 < uiRet)
{
return TRUE;
}
return FALSE;
}
int main()
{
winExec("C:\\Users\\Administrator\\Desktop\\窗口.exe");
}
#include <iostream>
#include <windows.h>
//ShellExecute
BOOL shellExecute(LPCWSTR pszExePath)
{
HINSTANCE hInstance = ShellExecute(NULL, NULL, pszExePath, NULL, NULL, SW_SHOWNORMAL);
if (32 < (UINT)hInstance)
{
return TRUE;
}
return FALSE;
}
int main()
{
shellExecute(L"C:\\Users\\Administrator\\Desktop\\窗口.exe");
}
#include <iostream>
#include <windows.h>
//CreateProcess
BOOL createProcess(LPSTR pszExePath)
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
BOOL bRet = FALSE;
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
bRet = CreateProcess(NULL, pszExePath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (bRet)
{
return TRUE;
}
return FALSE;
}
int main()
{
createProcess((LPSTR)"C:\\Users\\Administrator\\Desktop\\窗口.exe");
}
测试
运行newProcess.exe就会运行窗口.exe:
原理学习
WinExec和ShellExecute函数设置为SW_HIDE方式可隐藏运行程序窗口及CMD窗口。
CreateProcess函数指定窗口显示方式的时候,在STARTUPINFO结构体中将启用标志设置为STARTF_USESHOWWINDOW,表示wShowWidw成员显示方式有效;然后将wShowWidw设置为SW_HIDE隐藏窗口。
进程中想要创建以隐藏的方式运行进程,可以通过SendMessage向窗口发送SW_HIDE隐藏;或通过ShowWindow函数设置SW_HIDE隐藏窗口。
ShellExecute可以指定运行时的工作路径;