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