VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: download

[原创]全球首创? 再次突破VB极限!VB真正稳定多线程(第二季,可以用Msgbox了)

  [复制链接]
发表于 2010-5-6 15:55:54 | 显示全部楼层
嘿嘿~~~第二版测试继续进行中,又发现问题啦!

在线程中加入这样一段代码:
Dim pid As Long
pid = Shell("calc", vbNormalFocus)
Dim e1 As Long
e1 = OpenProcess(PROCESS_ALL_ACCESS, 0, pid)
Dim ret1 As Long
ret1 = WaitForSingleObject(e1, INFINITE)
MsgBox ret1

很简单,就是启动一个计算器,然后等待它退出。结果发现居然多出了一个form主窗体,和线程一起傻乎乎的等在后面。这究竟是为虾米捏?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-6 16:11:33 | 显示全部楼层
是线程中初始化的VB自动产生一个主窗体吧(估计是UserdllMain的后遗症)...线程结束后他就消失了.真正的主窗体是没卡住的那个...
回复 支持 反对

使用道具 举报

发表于 2010-5-6 16:30:48 | 显示全部楼层
22# download

I am here ... so code for get VBHeader I found somewhere on the net sometimes ago:

look at: http://vb-decompiler.com/viewtopic.php?f=2&t=1799


1) I have problem to use it, because when I declare some function from kernel (GetCurrentProces or CopyMemory), then application crash. Crash only for declaration, without using it, this is strange :) I try to use GetMem from msvbvm, but same result, thread crashed. Maybe using TLB for declaration is the way to do it, or an ASM thunk for calling this functions.

2) I found something about CreateIExpServObject .. it is not about IE, it is Expression Server used by JET, it is something like lightweight VB engine, look at http://support.microsoft.com/kb/236281 ... this function is called from expsrv.dll, maybe way for better investigation :)

Cheers,

izero
回复 支持 反对

使用道具 举报

发表于 2010-5-6 16:43:01 | 显示全部楼层
是线程中初始化的VB自动产生一个主窗体吧(估计是UserdllMain的后遗症)...线程结束后他就消失了.真正的主窗体是没卡住的那个...
download 发表于 2010-5-6 16:11


嘿嘿~~~我知道这个并不是真正的主窗体,但是这样其实也挺麻烦的,如果一不小心开多了几个线程,任务栏就会出现许许多多的窗体哈~~
回复 支持 反对

使用道具 举报

发表于 2010-5-6 16:46:35 | 显示全部楼层
如果不是看完这几页帖,还以为不能进行文件操作哩。老汉把5#的也改改吧,免得看起来前后矛盾。
回复 支持 反对

使用道具 举报

发表于 2010-5-6 16:48:16 | 显示全部楼层
23# izero

And ... here is the some CallApi function that maybe be usable for our things ...

http://culturahack.com.ar/Foro/index.php/topic,14539.0.html

izero
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-6 17:01:48 | 显示全部楼层
23# izero

And ... here is the some CallApi function that maybe be usable for our things ...

http://culturahack.com.ar/Foro/index.php/topic,14539.0.html

izero
izero 发表于 2010-5-6 16:48

hi, this is PE->EP->that I mention at the topic: level1.

the key of the code--->
Ctx.Eax = Pinh.OptionalHeader.ImageBase + Pinh.OptionalHeader.AddressOfEntryPoint



this func CallWindowProc is for (Window/Form)ui thread. I guess it'll crash in work thread.
  1. CallApi = CallWindowProcA(VarPtr(bvASM(0)), 0, 0, 0, 0)
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-5-6 17:14:21 | 显示全部楼层
在IDE中试了下BYTE固定数组,没崩。

在MsgBox "Thread OK", vbInformation, ""之后,加入:
    Dim strData As String
    Dim abc(3) As Byte

    Dim strData As String ,abc(3) As Byte

都没问题。可能RP有点好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-6 17:20:17 | 显示全部楼层
在IDE中试了下BYTE固定数组,没崩。

在MsgBox "Thread OK", vbInformation, ""之后,加入:
    Dim strData As String
    Dim abc(3) As Byte

    Dim strData As String ,abc(3) As Byte

都没问题。 ...
wolf3t 发表于 2010-5-6 17:14

倒~~偶没试固定,不喜欢固定,偶只用动态的
固定的内存不能释放,直到关闭程序...动态的不用可以erase释放掉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-5-6 17:24:01 | 显示全部楼层
嘿嘿~~~我知道这个并不是真正的主窗体,但是这样其实也挺麻烦的,如果一不小心开多了几个线程,任务栏就会出现许许多多的窗体哈~~
yimins 发表于 2010-5-6 16:43

估计和UI相关的函数会引起VB重新NEW一个启动窗体.
或许可以设成启动sub main然后在main里面检查是不是子线程...有点像AX EXE了...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-4 20:35

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表