1、WinExec
UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
参数:
lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行
uCmdShow:定义Windows应用程序的窗口如何显示
uCmdShow参数的取值:
SW_HIDE 隐藏
SW_MAXIMIZE 最大化
SW_MINIMIZE 最小化
SW_RESTORE 激活窗口并还原为初始化大小 SW_SHOW 以当前大小和状态激活窗口
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWDEFAULT 以默认方式运行
SW_SHOWMAXIMIZED 激活窗口并最大化
SW_SHOWMINIMIZED 激活窗口并最小化
SW_SHOWMINNOACTIVE 最小化但不改变当前激活的窗口
SW_SHOWNA 以当前状态显示窗口但不改变当前激活的窗口
SW_SHOWNOACTIVATE 以初始化大小显示窗口但不改变当前激活的窗口
SW_SHOWNORMAL 激活并显示窗口,如果是最大(小)化,窗口将会还原。第一次运行程序 时应该使用这个值
实例:打开cmd.exe文件
#include<windows.h>
#include<stdio.h>
UINT WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
int main()
{
WinExec("cmd.exe",SW_SHOW);
}
2、ShellExecute
HINSTANCE ShellExecute(HWND hwnd,LPCSTR lpOperation,LPCSTR lpFile,LPCSTR lpParameters,LPCSTR lpDirectory,INT nShowCmd);
参数:
hwnd:指定显示用户界面和错误信息的窗口句柄
lpOperation:对指定文件要执行的操作
lpFile:要执行操作的文件或对象
lpParameters:指定传送给应用程序的参数
lpDirectory:指定执行操作的工作目录
nShowCmd:指定应用程序如何显示
lpOperation参数的取值:
edit 打开一个文档文件进行编辑。如果参数lpFile指定的不是一个文档文件,则操作失败
explore 打开资源管理器查看指定文件所在的目录
find 从参数lpDirectory指定的目录开始搜索
open 打开指定的对象
print 打印指定的对象。如果参数lpFile指定的不是一个文档文件,则操作失败
NULL 执行默认的操作,通常执行open操作
实例:打开百度一下的页面
#include<windows.h>
#include<stdio.h>
HINSTANCE ShellExecute(HWND hwnd,LPCSTR lpOperator,LPCSTR lpFile,LPCSTR lpParameters,LPCSTR lpDirectory,INT nCmdShow);
int main()
{
ShellExecute(NULL,"open","http://www.baidu.com","","",SW_SHOW);
}
3、CreateProcess
BOOL WINAPI CreateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITU_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD deCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStratupInfo,LPPROCESS_INFORMATION lpProcessInformation);
参数:
lpApplicationName:要执行的应用程序名,通常为NULL
lpCommandLine:要执行的命令
lpProcessAttributes:新进程的安全描述符
lpThreadAttributes:指定主线程的安全描述符。如果为NULL,则使用默认的安全描述符
bInheritHandles:只是新进程是否从调用进程处继承句柄
deCreationFlags:指定附加的、用来控制优先类和进程创建的标志
lpEnvironment:指向新进程的环境块。如果为NULL,则使用调用CreateProcess()函数的进程的环境
实例:运行windows的计算器程序,并显示新进程的ID号,及其主线程的ID号
#include<windows.h>
#include<stdio.h>
BOOL WINAPI CteateProcess(LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD deCreationFlags,LPVOID ipEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupinfo,LPPROCESS_INFORMATION lpProcessInformation);
int main()
{
char szCommandLine[]="calc.exe";
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
si.dwFlags=STARTF_USESHOWWINDOW;//指定wShowWindow成员有效
si.wShowWindow=TRUE;//显示新进程的主窗口
BOOL bRet=CreateProcess(NULL,szCommandLine,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
//lpApplicationName=NULL,不在此指定可执行文件的文件名
//lpCommandLine=szCommandLine,命令行参数
//lpProcessAttributes=NULL,默认进程安全性
//lpThreadAttributes=NULL,默认进程安全性
//bInheritHandles=FALSE,指定当前进程内句柄不可以被子进程继承
//deCreationFlags=CTRATE_NEW_CONSOLE,为新进程创建一个新的控制台窗口
//lpEnvironment=NULL,使用本进程的环境变量
//lpCurrentDirectory=NULL,使用本进程的驱动器和目录
if(bRet){
//关掉不使用的句柄
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
printf("新进程的ID号:%d\n",pi.dwProcessId);
printf("新进程的主线程ID号:%d\n",pi.dwThreadId);
system("pause");
return 0;
}
}
4、EnumProcesses
BOOL WINAPI EnumProcesses(DWORD* pProcessIds,DWORD cb,DWORD* pBytesReturned);
参数:
pProcessIds:用于接收进程标示符列表的数组
cb:数组pProcessIds的大小,单位是字节
pBytesReturned:数组pProcessIds中返回数据的大小,单位是字节
实例:枚举当前windows运行进程的标示符(PID)
#include<stdio.h>
#include<windows.h>
#include<Psapi.h>
#pragma comment(lib,"Psapi.lib")
BOOL WINAPI EnumProcesses(DWORD* pProcessIds, DWORD cb, DWORD* pBytesREturned);
int main()
{
DWORD dwProcs[1024 * 2];
DWORD dwNeeded;
if (!EnumProcesses(dwProcs, sizeof(dwProcs), &dwNeeded)) {
printf("EnumProcesses failed (%d).\n", GetLastError());
}
else {
DWORD dwProcCount = dwNeeded / sizeof(DWORD);
for (int i = 0;i < dwProcCount;i++)
{
printf("PID:%d\n", dwProcs[i]);
}
}
system("pause");
return 0;
}
5、使用进程快照
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
参数:
dwFlags:指定快照中包含的对象
th32ProcessID:指定获取进程快照的PID。如果为0,则获取当前系统进程列表
dwFlags取值:
TH32CS_SNAPHEAPLIST:包含特定进程的堆栈列表
TH32CS_SNAPMPDULE:包含特定进程的使用模块的列表
TH32CS_SNAPPROCESS:包含系统的所有进程的列表
TH32CS_SNAPTHREAD:包含系统所有线程的列表
TH32CS_SNAPALL:表示使用了以下的全部标志
实例:调用Process32First函数可以从进程快照中获取第一个进程的信息
函数原型:
BOOL WINAPI Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
参数:
hSnapshot:之前调用createtoolhelp32napshot()函数得到的进程快照句柄
lppe:包含进程信息的结构体
实例:利用进程快照枚举当前windows运行进程的信息
#include"windows.h"
#include"stdio.h"
#include"tlhelp32.h"
int main()
{
PROCESSENTRY32 pe;//设置结构体pe的大小
pe.dwSize = sizeof(pe);//获取系统内进程的快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE) {
printf("CreatToolhelp32Snapshot error.\n");
return -1;
}
BOOL bMore = ::Process32First(hProcessSnap, &pe);
while (bMore) {
printf("===================================\n");
printf("Process Name:%s\n", pe.szExeFile);
printf("PID:%u\n", pe.th32ProcessID);
printf("Number of Thread:%u\n", pe.cntThreads);
printf("===================================\n");
bMore = ::Process32Next(hProcessSnap, &pe);
}
::CloseHandle(hProcessSnap);
system("pause");
return 0;
}
6、GetExitCodeProcess
BOOL WINAPI GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode);
参数:
hProcess:进程句柄
lpExitCode:用于接收进程的终止状态
在进程中调用ExitProcess函数终止其自身中所有的线程
VOID WINAPI ExitProcess(UINT uExitCode);
参数:
uExitCode:退出代码
调用TerminateProcess函数可以终止指定的进程
BOOL WINAPI TerminateProcess(HANDLE hProcess,UINT uExitCode);
参数:
hProcess:要终止的进程句柄
uExitCode:退出代码