几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » 数据库ObjectDBX
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-28, 10:10 AM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】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
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 09:27 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多