第一个VB声明编辑
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
说明
获取一个应用程序或动态链接库的模块句柄
返回值
Long,如执行成功成功,则返回模块句柄.零表示失败.会设置GetLastError
参数表
参数 类型及说明
lpModuleName String,指定模块名,这通常是与模块的文件名相同的一个名字.例如,NOTEPAD.EXE程序的模块文件名就叫作NOTEPAD
注解
只有在当前进程的场景中,这个句柄才会有效
2VC声明编辑
12
HMODULEGetModuleHandle(LPCTSTRlpModuleName);
功能说明
获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的进程空间中.
参数说明
lpModuleName 模块名称
返回值
如执行成功成功,则返回模块句柄.零表示失败.通过GetLastError获得错误信息
如:
1
GetModuleHandle(NULL);
这将返回自身应用程序句柄
注意
前提是:只有欲获取的模块已映射到调用该函数的进程内,才会正确得到模块句柄.常用模块映射函数:LoadLibrary(..).
3WIN32汇编声明编辑
GetModuleHandle,lpModuleName
函数的作用是返回指定模块名的句柄,如果为NULL,则返回本模块的句柄.
返回的句柄值存放在寄存器eax中.
lpModuleName参数是一个指向含有模块名称字符串的指针;
使用举例:
123456789101112131415161718
.686p.xmm.mmx.modelflat,stdcalloptioncasemap:none.dataszUserDlldb'User32.dll',0.data?hUserDllHandledd?sbErrorinvokeExitProcess,0start:invokeGetModuleHandle,offsetszUserDlltesteax,eaxjesbErrormovhUserDllHandle,eaxendstart...
4易语言声明编辑
Ansi版本:
.版本 2
.DLL命令 GetModuleHandleA, 整数型, "kernel32.dll", "GetModuleHandleA"
.参数 lpModuleName, 文本型
Unicode版本:
.版本 2
.DLL命令 GetModuleHandleW, 整数型, "kernel32.dll", "GetModuleHandleW"
.参数 lpModuleName, 字节集
第二个
当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的.该句柄必须具有 SYNCHRONIZE 访问权限.
目录
1对应函数
2说明
▪ 参数 ▪ 返回值
1对应函数编辑
VC声明
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
VB声明
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
2说明编辑
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
参数
hHandle[in]对象句柄.可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等.
dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了.如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回.如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回.
返回值
执行成功,返回值指示出引发函数返回的事件.它可能为以下值:
WAIT_ABANDONED0x00000080L
The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread and the mutex state is set to nonsignaled.
If the mutex was protecting persistent state information, you should check it for consistency.
WAIT_OBJECT_00x00000000L
The state of the specified object is signaled.
WAIT_TIMEOUT0x00000102L
The time-out interval elapsed, and the object's state is nonsignaled.
WAIT_FAILED(DWORD)0xFFFFFFFF
The function has failed. To get extended error information, callGetLastError.
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回.参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE.若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止.
返回值:
WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值.
WAIT_OBJECT_0 0x00000000 :核心对象已被激活
WAIT_TIMEOUT 0x00000102:等待超时
WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码
在这里举个例子:
先创建一个全局Event对象g_event:
CEvent g_event;
在程序中可以通过调用CEvent::SetEvent设置事件为有信号状态.
下面是一个线程函数MyThreadPro()
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
WaitForSingleObject(g_event,INFINITE);
For(;;)
{
………….
}
return 0;
}
在这个线程函数中只有设置g_event为有信号状态时才执行下面的for循环,因为g_event是全局变量,所以我们可以在别的线程中通过g_event. SetEvent控制这个线程.
还有一种用法就是我们可以通过WaitForSingleObject函数来间隔的执行一个线程函数的函数体
UINT CFlushDlg::MyThreadProc( LPVOID pParam )
{
while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
{
………………
}
return 0;
}
在这个线程函数中可以通过设置MT_INTERVAL来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔MT_INTERVAL执行一次,当设置事件为有信号状态时,线程就执行完毕了.