![]() |
【转帖】vba documents.open总是出错造成autocad崩溃,请教达人
vba documents.open总是出错造成autocad崩溃,请教达人
www.dimcax.com vba documents.open总是出错造成autocad崩溃,请教达人 我在多个版本的autocad中使用vba打开文档,总是出现autocad崩溃的现象,不知道是vba稳定性差,还是我的程序有问题? 以下是打开文件的函数,如果连续调用该函数打开多个文件,就会随机性出现autocad系统崩溃的问题,不明白是何缘故?难道documents.open方法就是这样的不稳定? sub opendrawing(dwgname as string) '独立宏: 使用open 方法打开文件dwgname dim opened as integer opened = drawingopened(dwgname) '检查文件是否已经被打开 if opened = 0 then if dir(dwgname) <> "" then thisdrawing.application.documents.open dwgname else '否则 msgbox "文件 " & dwgname & " 不存在!", 48, "警告" end if else '文件已经被打开 if msgbox(dwgname & " 已经打开," & vbcrlf & vbcrlf & "您确定要以只读方式再次打开它吗?", 4 + 48 + 256) = 6 then thisdrawing.application.documents.open dwgname '只读打开 end if end if end sub function drawingopened(filename as string) '检测文件是否已经打开,是则返回1,否则返回0 'filename: 要检测的文件名,必须是带路径的全名 dim drawing as acaddocument dim tmp as string for each drawing in thisdrawing.application.documents tmp = trim(drawing.fullname) if tmp = filename then drawingopened = 1 exit function end if next drawing drawingopened = 0 end function option explicit public sub opendrawing() '独立宏不要带参数 dim dwgname as string on error goto openerr dwgname = trim(inputbox("请输入图形文件的全名:", "打开:")) '暂时用输入框代替 if dir(dwgname) = "" then '检测文件名是否有效 msgbox "文件 " & dwgname & " 不存在!", 48, "警告" exit sub end if if drawisopened(dwgname) = false then '检查文件是否已经被打开 thisdrawing.application.documents.open dwgname else '文件已经被打开 if msgbox( " 此文件已经打开," & vbcrlf & vbcrlf & "您确定要以只读方式再次打开它吗?", vbyesno + vbquestion + vbdefaultbutton2) = vbyes then thisdrawing.application.documents.open dwgname , true '只读打开 end if end if exit sub openerr: msgbox err.number & " " & err.description end sub private function drawisopened(filename as string) as boolean '检测文件是否已经打开,是则返回true,否则返回flase 'filename: 要检测的文件名,必须是带路径的全名 dim drawing as acaddocument for each drawing in thisdrawing.application.documents if trim(drawing.fullname) = filename then drawisopened = true exit function end if next drawisopened = false end function 给你几点建议: 1.你的程序没有错误处理部分 2.要先检验文件的有效性,避免发生不必要的错误 3.函数部分没有返回类型,只有真假两种结果的返回值应该用boolean类型 4.在for循环里的tmp = trim(drawing.fullname)这句多余,因为每循环一次它就要负值一次,并不提高效率 5.常量尽量不要用数字代替,这个数字在编程界叫天数,很难知道它的意义,要不然为什么要定义常量,这样会产生软件危机的 非常感谢,我试试看 使用数字让人很崩溃,简直不知所言。如果使用参数的话,还是不要用过程,用函数的形式好,即不用sub,用function ,有参数的宏是没法独立的,只能被调用,不能独立运行 没发现明显的错误 主要是没有错误处理部分 加上错误处理机制后还是系统崩溃,所以我还是觉得autocad自身的vba是有问题的。回头我把完整的代码贴上来,请各位研究研究,谢谢 在哪个地方崩溃呀,是不是你的cad有问题呀 这部分代码我是调试过的,没有发现什么问题呀 我把完整的程序贴上来,这是测试一下破解autocad加密文件的工具。只是现在面临两大问题: 1. 运行到若干次后autocad崩溃; 2. 速度太慢。 理论上可暴力破解autocad加密文件,实际上恐怕等到花儿都谢完了也解不开.... 我是在autocad mechnical 2009 (xp sp2,1.7g内存)中测试的。 2 |
所有的时间均为北京时间。 现在的时间是 07:33 PM. |