func 嵌套调用DLLCLOSE出错的奇怪问题
本帖最后由 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就没事。请问怎么回事 回复 1# 3370225
请先看看你的MSGBOX调用对不对 回复 2# 楼上风云
这个应该没关系吧,MSGBOX只是我加上的,去掉一样,主要是跟DLLclose有关,这个一去掉就没问题 本帖最后由 楼上风云 于 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() 回复 4# 楼上风云
好像是跟DLL有关,不嵌套也会这样。。。只要用DLLclose就会了,,蛋疼了 回复 5# 3370225
不显式DLLclose关闭,AU3退出时也会自动关闭它。 这个111i.dll在被加载之时,会创建一个新的线程,至于这个线程会做什么工作,不得而知。等到AU3执行到DllClose这一句时,由于线程还处于运行状态,但自身代码已被卸载,由此而出现异常。 回复 7# pusofalse
P大,像这种线程需要一定时间来完成处理的DLL,看来还是通过AU3退出时自动关闭的好啊? 回复 8# 楼上风云
是这样的~ 关键要看线程正在执行哪个文件中的代码,如果正在执行DLL中的代码,那么此刻调用DllClose来释放DLL,就会直接引发异常。 AU3进程在退出时,会调用ExitProcess函数,此函数在内部会首先将进程中的所有线程结束掉,然后再退出进程。 回复 9# pusofalse
P大。 纠结了,这个DLL的类名会被游戏检测,调用后不马上关掉会悲剧。现在直接做成1个EXE,让AU3调用这个EXE,除了这个还有什么更方便的办法没? 回复 10# 3370225
这个要修改DLL吧。或者直接挂钩CreateThread这个API函数,不让它创建线程,但这样做的话,DLL的实际功能可能会受影响。你又要使用DLL的功能,又不想让它运行,这真得很纠结啊~
页:
[1]