Windows进程和线程常用API

本文详细介绍了Windows API中用于进程管理和线程创建的相关函数,包括GetModuleFileNameA获取可执行文件路径,GetCommandLine获取命令行参数,GetEnvironmentStrings获取环境变量,GetCurrentDirectory获取当前目录,CreateProcess创建新进程,以及CreateThread和_beginthreadex创建线程等。这些函数是Windows编程中进行进程线程控制的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


进程

GetModuleFileNameA 获取一个可执行文件或DLL文件的位置

DWORD GetModuleFileNameA(HMDULE hModule,LPSTR lpFilename,DWORD nSize);
// hModule所需路径的模块的句柄。如果该参数为NULL,函数会获取当前进程的运行文件(.exe文件)的全路径。
//lpFilename 缓冲区,nSize	缓冲区大小

char module_filename[MAX_PATH];
GetModuleFileNameA(NULL, module_filename, MAX_PATH);
cout << module_filename << endl;

GetCommandLine 获取指向当前进程命令行的指针

LPSTR GetCommandLineA();

若要将命令行转换为 argv 样式的字符串数组,请将结果从 GetCommandLineA 传递到 CommandLineToArgW。

GetEnvironmentStrings 获取完整环境块

LPCH GetEnvironmentStrings();

将此内存视为只读;不要直接修改它。若要添加或更改环境变量,请使用 GetEnvironmentVariable 和 SetEnvironmentVariable 函数。

当不再需要 GetEnvironmentStrings 返回的块时,应通过调用 FreeEnvironmentStrings 函数来释放它。

GetCurrentDirectory 获取当前进程所在的目录

DWORD GetCurrentDirectory(
  [in]  DWORD  nBufferLength,
  [out] LPTSTR lpBuffer
);

CreateProcess 创建一个进程

BOOL CreateProcess( 
LPCWSTR lpszImageName, 
LPCWSTR lpszCmdLine, 
LPSECURITY_ATTRIBUTES lpsaProcess, 
LPSECURITY_ATTRIBUTES lpsaThread, 
BOOL fInheritHandles, 
DWORD fdwCreate, 
LPVOID lpvEnvironment, 
LPWSTR lpszCurDir, 
LPSTARTUPINFOW lpsiStartInfo, 
LPPROCESS_INFORMATION lppiProcInfo);

GetCurrentProcessId 获取当前进程ID

DWORD GetCurrentProcessId(void);

线程

CreateThread 创建线程

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);

//线程入口函数固定格式(函数名ThreadProc可以改变)
DWORD WINAPI ThreadProc(LPVOID lpParameter){}

•lpThreadAttributes,描述线程安全的结构体,默认传NULL.

• dwStackSize,堆栈大小,默认为0(1MB).

• lpStartAddress,线程函数入口地址。

• lpParameter,线程函数参数。

• dwCreationFlags,线程创建时的状态,0表示线程创建之后立即运行。CREATE_SUSPENDED表示线程创建完挂起,直到调用ResumeThread才运行。

• lpThreadId,指向1个变量接受线程ID,可为NULL。

创建线程 _beginthreadex

 unsigned long _beginthreadex(
 	void *security, 
 	unsigned stack_size, 
 	unsigned(_stdcall *start_address)(void *), 
 	void *argilist,  
 	unsigned initflag, 
 	unsigned *threaddr);


#include <process.h>
unsigned int __stdcall first(void*) {
	std::cout << "this is first thread!" << std::endl;
	return 0;
}
int main() {
	unsigned int d1;
	HANDLE handle = (HANDLE)_beginthreadex(nullptr,0, first,nullptr,0,&d1);
    CloseHandle(handle);
	Sleep(1000);
	std::cout << "handle = " << handle << std::endl;
	std::cout << "threadid = " << d1 << std::endl;
	return 0;
}
  • security 安全属性, 为NULL时表示默认安全性
  • stack_size 线程的堆栈大小, 一般默认为0
  • start_address 线程入口函数
  • argilist 线程函数的参数,是一个void*类型, 传递多个参数时用结构体
  • initflag 新线程的初始状态,0表示立即执行,CREATE_SUSPENDED 表示创建之后挂起
  • threaddr 用来接收线程ID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值