VBGood网站全文搜索 Google

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

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 8144|回复: 10

【半原创】发表一个下午的成果:多线程DLL(含源码)

[复制链接]
 楼主| 发表于 2012-2-3 17:00:33 | 显示全部楼层 |阅读模式
本帖最后由 h907308901 于 2012-2-3 17:01 编辑

注意:此代码属无聊之作,仅供学习和研究,如果要实际运用,请下载论坛其他网友发表的相关代码

此DLL是根据DOWNLOAD的多线程第二季改来的,原理差不多,好处就是把相关代码都封装到一个DLL里面,只需调用DLL提供的函数,且线程函数中无需初始化,详情请见附件

如果觉得支持的线程参数个数太少(此DLL中只有一个线程参数 )的话,可以使用结构体(注意:传结构体的话最好申请一段内存保存结构体,千万不能使用局部变量!!!

另外,杀软对这个东西很敏感,估计是使用了内嵌汇编的缘故,请放心使用



注意,编译DLL需要AmicForVB和AsmInVB插件,需要的请回复,我去找一下……
如果需要ThreadAPI.tlb的IDL源码的我会在适当的时候发上来

另:从某外国网站上找到的关于VBHeader的结构体声明(就是那个FakeHeader,“VB5!……&@%¥#¥vb6chs.dll¥#%……”),存储了跟VB工程、窗口、模块相关的东西,有兴趣的研究下哈



补充内容 (2012-2-5 15:21):
UPDATED AT 6L AND 8L

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

搞错了……MSVBVM60的导出函数在VBAEXE6.LIB里面……  发表于 2012-2-5 07:52
看起来要我亲自写山寨链接器了,或者用不需要链接的汇编器,例如FASM  发表于 2012-2-4 14:55
“直接用汇编写一个DLL怎样?” 那也可以,但是还是偷懒算了,而且只可以动态调用API,因为我没有MSVBVM60.LIB……  发表于 2012-2-4 10:01
直接用汇编写一个DLL怎样?  发表于 2012-2-4 00:31
vb还要汇编插件……木有耶……  发表于 2012-2-3 18:23

评分

参与人数 2威望 +1 金钱 +20 人气 +6 收起 理由
peace2008 + 1 + 1 赞一个!
eaaca1234 + 20 + 5 顶!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2012-2-3 17:09:33 | 显示全部楼层
本帖最后由 阿富 于 2012-2-3 18:43 编辑

看看神马



楼主,第一个包dll.rar下不来
回复 支持 反对

使用道具 举报

发表于 2012-2-3 18:57:59 | 显示全部楼层
另:从某外国网站上找到的关于VBHeader的结构体声明(就是那个FakeHeader,“VB5!……&@%¥#¥vb6chs.dll¥#%……”),存储了跟VB工程、窗口、模块相关的东西,有兴趣的研究下哈



我对这玩意比较感兴趣

点评

……点评发错地方了  发表于 2012-2-4 00:31
直接用汇编写一个DLL怎样?  发表于 2012-2-4 00:30
回复 支持 反对

使用道具 举报

发表于 2012-2-4 00:19:06 | 显示全部楼层
还是用不了serverxmlhttp,一开就自动退出
回复 支持 反对

使用道具 举报

发表于 2012-2-4 03:13:14 | 显示全部楼层
Want to study this Way   
Very interest
I accomplish Multithread Socket Server but work with Loops  
Now want to find the way how work with forms  
BTW Thanks for the Sharing  

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-4 17:08:50 | 显示全部楼层
本帖最后由 h907308901 于 2012-2-4 17:17 编辑

更新了一下,先把那两个插件发上来:

(我的金山老是报毒,昨天是那个DLL,今天是ASMINVB插件
ThreadAPI.idl下载:


今天一个下午又用汇编写了一个DLL,其中MSVBVM60的那几个函数还是用了动态调用
顺便解决了线程中的Form问题:
Form是可以在初始化后的线程中直接使用的,但是第二次创建线程就出问题了。。。
原因:编译器在程序中预留了一些变量,用来表示对象是否被初始化过,每次在引用Form对象时,会先根据变量判断对象是否引用过,没有的话就调用__vbaNew2初始化对象(相当于Set xxx=New xxx,不过这个编译出来是调用__vbaNew),线程结束后对象也就销毁了,但是变量却没有更改,所以下一次使用时没有初始化对象,所以……
解决办法:
很脏的代码,目的是强制初始化对象:
Set MDIForm1 = New MDIForm1
Set Form2 = New Form2
每个Form都要这样 - - MDIForm貌似也可以直接使用
现在还有CreateObject的问题,初步判断是在__vbaLateIdSt中出错……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2012-2-4 21:16:25 | 显示全部楼层
看看正在找多线程都准备用 timeSetEvent了事了。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-2-5 15:20:33 | 显示全部楼层
再次更新,这回支持任意数量的参数,并且修正了几处疏漏,不过在多线程中千万不能出错,一出错就崩溃,经测试CreateObject没有问题,上回那个是因为漏了Set不过对于sexfio网友的winhttp或serverxmlhttp异步问题还是暂时没有解决办法

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2012-2-5 23:52:31 | 显示全部楼层
本帖最后由 sexfio 于 2012-2-6 00:02 编辑

ThreadDLL.rar里面是什么?没看懂

我再详细说下我想实现的吧,30个线程,每个线程利用winhttp“反复循环”(相当于监测了)获取百度的源码,时间间隔100ms,然后加上线程号和timer显示出来,随便利用什么控件显示出来都行,就这个要求,实现看看哈

点评

关键就是要同时调用啊,为什么会出错呢,他们老汉的也是一样,运行一会就突然把电脑卡死机了,任务管理器都搞不出来,直接卡死,找不出原因  发表于 2012-2-6 16:25
ThreadDLL.rar里面是DLL源代码,汇编写的,看不懂就算了……另外我这里winhttp一个线程调用没问题,多个线程如果同时调用了WINHTTP对象就出错了……其他的都不怎么难,关键就是在这里,如果多个线程错开调用就不出错  发表于 2012-2-6 15:06
回复 支持 反对

使用道具 举报

发表于 2012-2-6 00:18:32 | 显示全部楼层
Nice nice  
Able use forms  
thanks for sharing   
Is possible to use forms  without Dll   ?
good afternoon  

点评

see http://www.vbgood.com/thread-93124-1-1.html, it has no DLL, and please use Set Form1 = New Form1 before call form  发表于 2012-2-6 14:57
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-6-26 03:31

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