VB6稳定多线程,一直是争论很大的的。
比较稳定的多线程,一般使用
set MT=CreateObject("VbMT.MT")
但其他单元线程之间,是无法访问的,只有在创建者中,才可使用该对象MT.
还有一个问题,如果设置单元线程停止,一般通过设置属性,比如MT.bStop=True,设停止参数,
然后再单元线程中通过检测bStop而退出的。
但问题来了,如果单元线程挂起,通过MT.bStop=True,会让当前线程死锁状态。程序不能执行下去的。
所以问题来了,不能通过设置对象的属性方法了。这个时候,必须通过地址方法设置。
所以,取得类模块的函数地址,变量地址,通过回调函数函数指针,直接执行函数,是不会死锁的。
下面给出求类模块函数地址的方法:
Private Function GetClassProcAddress(ByVal SinceCount As Long) As Long
'***************************************************************************************************
' VB6 历史上最简单的获取类中指定函数地址的函数诞生了,can be get address of property to value ,too
'***************************************************************************************************
Dim i As Long, jmpAddress As Long
CopyMemory i, ByVal ObjPtr(Me), 4 ' get vtable
CopyMemory i, ByVal i + (SinceCount - 1) * 4 + &H1C, 4 ' 查表
CopyMemory jmpAddress, ByVal i + 1, 4 ' 获取的函数地址实际还是一个表,是一个跳转表
GetClassProcAddress = i + jmpAddress + 5 ' 计算跳转相对偏移取实际地址
End Function
只求出类模块中函数地址是无法调用类模块函数的,因为类模块函数调用,使通过函数指针、类实例地址,函数参数三部分组成,
VB没有函数指针概念,VB函数在参数中不能传递函数指针参数,这个时候,可使用VC6写一个函数给VB6使用
VC DLL 函数如下:
typedef int ( __stdcall * FunType)(int lpBuff,int nSize );
typedef int ( __stdcall * MsgFunType)(int nHandle,int nMessage,int wParam,int lParam );
typedef void ( __stdcall * VbClassFunType)( int nObjPtr,int nHandle,int nMessage,int wParam,int lParam);
int __stdcall CallAnyFunc(int lpfn,int lpBuff,int nSize )
{
FunType pFunc;
pFunc=(FunType)lpfn;
return ( *pFunc)( lpBuff,nSize );
}
int __stdcall CallMsgFunc(int lpfn,int nHandle,int nMessage,int wParam,int lParam )
{
MsgFunType pFunc;
pFunc=(MsgFunType)lpfn;
return ( *pFunc)( nHandle, nMessage, wParam, lParam );
}
int __stdcall CallVbClassFunc(int lpfn,int nObjPtr,int nHandle,int nMessage,int wParam,int lParam )
{
VbClassFunType pFunc;
pFunc=(VbClassFunType)lpfn;
( *pFunc)( nObjPtr,nHandle, nMessage, wParam, lParam );
return 0;
}