进程编程API

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:退出代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值