VB6多线程探秘

来源:互联网 发布:数据资产管理 公司 编辑:程序博客网 时间:2024/05/29 19:46

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;

}

 

0 0
原创粉丝点击