CreateThread()
功能:创建线程
返回值:线程创建成功返回新线程的句柄,失败返回NULL
函数原型:
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, __drv_aliasesMem LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );
参数
第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数 dwStackSize 表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数 lpParameter 是传给线程函数的参数。
第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数 lpThreadId 将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
* 创建第一个线程。主进程结束,则撤销线程。 */
#include<Windows.h>
#include<stdio.h>
DWORD WINAPI ThreadFunc(LPVOID);
void main()
{
HANDLE hThread;
DWORD threadId;
hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadId); // 创建线程
printf("我是主线程, pid = %d\n", GetCurrentThreadId()); //输出主线程pid
Sleep(2000);
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
printf("我是子线程, pid = %d\n", GetCurrentThreadId()); //输出子线程pid
return 0;
}
GetModuleHandle
功能:为了知道一个可执行文件或DLL文件被加载到进程地址空间的什么位置,可以用GetModuleHandle函数来返回一个句柄/基地址
返回值:成功返回模块句柄,失败返回NULL
函数原型:
HMODULE GetModuleHandle( LPCTSTR lpModuleName );
参数:
lpModuleName
指向一个以空终止的字符串,该字符串包含模块名称,该名称必须是DLL文件。
如果省略文件扩展名,则会附加默认库扩展名.dll。
文件名字符串可以包含结尾字符(。),以指示模块名称没有扩展名。
如果此参数为NULL(0),则GetModuleHandle返回当前进程的伪句柄。
所有路径都将被忽略;仅使用文件名和扩展名。伪句柄是一个特殊常量,被解释为当前线程句柄。当需要线程句柄时,调用线程可以使用此句柄指定自身。