VBGood网站全文搜索 Google

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

VB爱好者乐园(VBGood)

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

[讨论] *再谈VB多线程和标准DLL问题*

  [复制链接]
 楼主| 发表于 2011-10-19 12:39:22 | 显示全部楼层
本帖最后由 tgy 于 2011-10-19 12:55 编辑

还是有点问题,动态调用DLL时,无法正常FREE,如果dll窗口未关闭时FREE,会连主进程一起FREE掉了,如果关闭了DLL中的窗口再free,也不能正常释放(难道是DLL内部使用了多线程的原因?),查看内存使用根本就没有变多少,虽然不影响使用,但不能体现动态调用DLL的动态释放内存资源的优越性.


补充内容 (2011-10-20 22:08):
所以干脆不FREE,就什么事情都没有.另静态调用后,当结束主进程时会提示内存不能为读错误.

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2011-10-20 01:00:05 | 显示全部楼层
本帖最后由 hackerrose 于 2011-10-20 01:04 编辑
tgy 发表于 2011-10-19 12:39
还是有点问题,动态调用DLL时,无法正常FREE,如果dll窗口未关闭时FREE,会连主进程一起FREE掉了,如果关闭了DLL ...


这个无法卸载的问题,以前多线程注入dll也有。。

---------------------------------------

当我用:

Public Sub RunThread()
    'RunThread 函数为DLL初始化完成后的启动函数(dll注入必须),此处为独立线程启动,也可不用线程启动
    form1.Show 1
End Sub

CreateThread 0, 0, AddressOf RunThread, ByVal hinstdll, 0, 0            '新建独立线程启动

这一句时出现问题,会报错:

---------------------------
taskmgr.exe - 应用程序错误
---------------------------
"0x7339917f" 指令引用的 "0x00000018" 内存。该内存不能为 "read"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------

不创建线程,直接 RunThread,倒没有问题,缺点:会造成主进程挂起。。。。

以前的那个 VB 可注入稳定多线程Dll,倒没有这个问题、、

这是个什么问题?

补上源码:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-20 08:05:39 | 显示全部楼层
本帖最后由 tgy 于 2011-10-20 08:09 编辑
hackerrose 发表于 2011-10-20 01:00
这个无法卸载的问题,以前多线程注入dll也有。。

---------------------------------------


如果要独立线程启动,必须对线程初始化,在线程函数前调用初始化函数,这个是VB多线程最基本的方法了,如下:
Public Sub RunThread()                                                          'RunThread 函数为DLL初始化完成后的启动函数(dll注入必须)
  init hh   
form1.Show 1
End Sub
回复 支持 反对

使用道具 举报

发表于 2011-10-20 13:53:43 | 显示全部楼层
很高兴又有新的了,我用以前的一直很稳定的, 这个一定也要看看.
回复 支持 反对

使用道具 举报

发表于 2011-10-20 15:17:43 | 显示全部楼层
喜欢VB,没有理由,顶!!!
回复 支持 反对

使用道具 举报

发表于 2011-10-20 15:51:58 | 显示全部楼层
tgy 发表于 2011-10-20 08:05
如果要独立线程启动,必须对线程初始化,在线程函数前调用初始化函数,这个是VB多线程最基本的方法了,如下 ...

哈哈哈,受教了。。。
回复 支持 反对

使用道具 举报

发表于 2011-10-29 20:37:38 | 显示全部楼层
测试了下,非常稳定。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 08:39:45 | 显示全部楼层
本帖最后由 tgy 于 2011-10-31 19:34 编辑

鉴于很多人员不知如何使用,下面给个简单例子(源码),只要设为从sub main()启动,不需设置静态变量判断也不会重复加载主窗体:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2011-10-31 10:36:35 | 显示全部楼层
tgy 发表于 2011-10-31 08:39
鉴于很多人员不知如何使用,下面给个简单例子(源码),只要设为从sub main()启动,不会重复加载主窗体:

谢谢哦,看了一下,问个问题
CreateThread 0&, 0&, AddressOf showform2, ByVal App.hInstance, 0&, 0
这句是创建线程是吧,showform2是创建的对象,为什么要弄成窗体的?有什么优势吗?
如果我要创建的是一个function调用的话,是不是在模块里public function XXX()...
然后CreateThread 0&, 0&, AddressOf XXX, ByVal App.hInstance, 0&, 0
这样就可以了???
如果是的话,那还有个问题,我调用这个function,要引入的参数怎么弄?每个线程引用的XXX导入参数应该不一样啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-31 10:44:23 | 显示全部楼层
本帖最后由 tgy 于 2011-10-31 11:13 编辑
sexfio 发表于 2011-10-31 10:36
谢谢哦,看了一下,问个问题
CreateThread 0&, 0&, AddressOf showform2, ByVal App.hInstance, 0&, 0
...


显示窗体只是我写的例子,当然也可以不显示窗体,根据自己需要.但是有个老问题,如果直接在线程函数中定义固定维数的数组会出错,但如果在线程中的窗体中定义固定维数数组就不会出错了.
关于参数,只能通过线程参数传进去,如果需传多个参数,只能通过结构体,因为线程参数只能传一个.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-6-29 02:31

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