找回密码
 加入
搜索
查看: 5201|回复: 10

[系统综合] func 嵌套调用DLLCLOSE出错的奇怪问题

  [复制链接]
发表于 2013-5-26 15:13:48 | 显示全部楼层 |阅读模式
本帖最后由 3370225 于 2013-5-26 15:22 编辑

Func yzm()
$dll1=DllOpen(@TempDir & "\111i.dll")
DllCall ( $dll1,"none","Set","str","11111")
DllClose($dll1)
EndFunc

Func a()
MsgBox("","","a")
b()
EndFunc

Func b()
MsgBox("","","b")
yzm()
EndFunc

a()

求解。如图,yzm直接调用没问题,但是在调用a()时这样就会出现如图内存错误。如果去掉DLLCLOSE就没事。请问怎么回事

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-5-26 16:31:13 | 显示全部楼层
回复 1# 3370225

请先看看你的MSGBOX调用对不对
 楼主| 发表于 2013-5-26 17:28:21 | 显示全部楼层
回复 2# 楼上风云

这个应该没关系吧,MSGBOX只是我加上的,去掉一样,主要是跟DLLclose有关,这个一去掉就没问题
发表于 2013-5-26 18:10:10 | 显示全部楼层
本帖最后由 楼上风云 于 2013-5-26 18:12 编辑

回复 3# 3370225

估计与DLL本身有关,要看它的返回方式。如果实在没办法解决,那还是奖$DLL1独立提取出来,脚本退出时再用DLLCODE它。
你试试下面的代码,运行就正常。
Func yzm()
$dll1= DllOpen("user32.dll")
DllCall($dll1, "int", "MessageBoxW", "hwnd", 0, "wstr", "若干文本", "wstr", "若干标题", "int", 0)
DllClose($dll1)
EndFunc

Func a()
b()
EndFunc

Func b()
yzm()
EndFunc

a()
 楼主| 发表于 2013-5-26 18:25:29 | 显示全部楼层
回复 4# 楼上风云

好像是跟DLL有关,不嵌套也会这样。。。只要用DLLclose就会了,,蛋疼了
发表于 2013-5-26 19:00:18 | 显示全部楼层
回复 5# 3370225
不显式DLLclose关闭,AU3退出时也会自动关闭它。
发表于 2013-5-26 19:54:15 | 显示全部楼层
这个111i.dll在被加载之时,会创建一个新的线程,至于这个线程会做什么工作,不得而知。等到AU3执行到DllClose这一句时,由于线程还处于运行状态,但自身代码已被卸载,由此而出现异常。
发表于 2013-5-26 20:09:26 | 显示全部楼层
回复 7# pusofalse

P大,像这种线程需要一定时间来完成处理的DLL,看来还是通过AU3退出时自动关闭的好啊?
发表于 2013-5-26 20:26:51 | 显示全部楼层
回复 8# 楼上风云


    是这样的~ 关键要看线程正在执行哪个文件中的代码,如果正在执行DLL中的代码,那么此刻调用DllClose来释放DLL,就会直接引发异常。 AU3进程在退出时,会调用ExitProcess函数,此函数在内部会首先将进程中的所有线程结束掉,然后再退出进程。
 楼主| 发表于 2013-5-27 00:34:58 | 显示全部楼层
回复 9# pusofalse


  P大。 纠结了,这个DLL的类名会被游戏检测,调用后不马上关掉会悲剧。现在直接做成1个EXE,让AU3调用这个EXE,除了这个还有什么更方便的办法没?
发表于 2013-5-27 01:05:51 | 显示全部楼层
回复 10# 3370225


    这个要修改DLL吧。或者直接挂钩CreateThread这个API函数,不让它创建线程,但这样做的话,DLL的实际功能可能会受影响。你又要使用DLL的功能,又不想让它运行,这真得很纠结啊~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-25 13:37 , Processed in 0.134184 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表