cheng5276 发表于 2014-10-20 15:18:33

请教c# 如何加载LSP、VLX等

本帖最后由 cheng5276 于 2014-10-20 15:31 编辑

小弟初转C#.以前学LISP的,故很多以前写的LISP程序需要同步使用。
打算在CAD启动时,在自动加载的自定义DLL中加入加载vlx的功能,从而完成整个程序的初始化。

以下为为CAD2010中文版加入自动加载DLL的注册表方法
Windows Registry Editor Version 5.00

"LOADER"="C:\\工具包\\初始化.dll"
"MANAGED"=dword:0001c101
"LOADCTRLS"=dword:0001c102

目前仅知如下方法:
1、利用ACAD.LSP等文件的方法,在其中加入如下代码:
(load "c:\\AAA\\001.VLX)
      缺点:很多CAD病毒,都是利用此类文件,当采用此方法,非常容易被杀毒软件误杀掉,造成启动失败

2、利用C# SendStringToExecute 方法:
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.SendStringToExecute("(vl-load-all \"C:\\\\NITA(杭州)工具包\\\\DATA\\\\HB01.vlx\") ", true, false, false);
缺点:经常无法加载成功,原因未知(可能是因为CAD此时并未启动好,故这个SendStringToExecute方法无法执行吧,如果是自己手动加载这个DLL,此时是能够执行成功的)

请教老大们有其他更好的方式么?

sieben 发表于 2014-10-22 08:32:34

2、利用C# SendStringToExecute 方法:
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.SendStringToExecute("(vl-load-all \"C:\\\\NITA(杭州)工具包\\\\DATA\\\\HB01.vlx\") ", true, false, false);
缺点:经常无法加载成功,原因未知(可能是因为CAD此时并未启动好,故这个SendStringToExecute方法无法执行吧,如果是自己手动加载这个DLL,此时是能够执行成功的)
-----------------------------------
根据我碰到的情况,这里是否成功的和AutoCAD的状态有关,假如AutoCAD可以执行命令了,这个方法是没有问题的,但假如AutoCAD还在启动过程中,判断为命令行没有提示有命令被执行过,则此方法是不被执行的,我用的是SendCommand,情况应该是一样

sieben 发表于 2014-10-22 08:34:28

另外,在一个命令里面装载Lisp文件,同时在这个命令里面执行该Lisp文件的函数,应该也是不行的

sieben 发表于 2014-10-22 08:45:55

sieben 发表于 2014-10-22 08:32 static/image/common/back.gif
2、利用C# SendStringToExecute 方法:
Document acDoc = Application.DocumentManager.MdiActiveDocument ...

前面表述有误,我用SendCommand不是不执行,应该是执行装载成功了,但Lisp里面的函数要等到可以执行命令后才可以被C#调用

cheng5276 发表于 2014-10-23 14:22:23

sieben 发表于 2014-10-22 08:45 static/image/common/back.gif
前面表述有误,我用SendCommand不是不执行,应该是执行装载成功了,但Lisp里面的函数要等到可以执行命令后才 ...

谢谢老大,有没有什么方法能够判断CAD已经启动完毕,此时进入了可执行LISP函数的状态呢?

cheng5276 发表于 2014-10-23 14:30:11

如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在c#与LISP关联的每个按钮的点击函数开头,加入自动判断并加载LSP的代码了。

初始化时,设置一公共全局变量
Public Static Bool LOADED=FALSE;

在按钮函数中加入;
if (!LOADED)
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
acDoc.SendStringToExecute("(vl-load-all \".........vlx\") ", true, false, false);
LOADED=true;
}


sieben 发表于 2014-10-23 15:42:00

cheng5276 发表于 2014-10-23 14:22 static/image/common/back.gif
谢谢老大,有没有什么方法能够判断CAD已经启动完毕,此时进入了可执行LISP函数的状态呢?

程序方法我没有,在用户的角度有,就是当AutoCAD的命令行上可以看到"命令:"这个提示时,Lisp的函数就可以调用了

sieben 发表于 2014-10-23 15:47:25

cheng5276 发表于 2014-10-23 14:30 static/image/common/back.gif
如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在c#与LISP关联的每个按钮的点击函数开头,加入 ...

这里有两个没有用
1,如果AutoCAD还在启动过程中,这个函数是可以执行的,你的Load会被设置为true,但是你的Lisp函数还是不能被调用
2,如果你所说的按钮是通过你的一个命令弹出一个对话框的按钮,那么可以确定你的Lisp函数已经可以调用,只要你的Lisp文件已经装载,因为AutoCAD已经处在可以执行命令的状态

注:装载Lisp文件的是可以在AutoCAD启动过程中执行的,只是Lisp文件里面的函数不能在AutoCAD启动过程调用

sieben 发表于 2014-10-23 15:49:02

cheng5276 发表于 2014-10-23 14:30 static/image/common/back.gif
如果无法实现,除了以上方法,看来只能通过以下变通方法了;
在c#与LISP关联的每个按钮的点击函数开头,加入 ...

当然,如果你不打算在AutoCAD的启动过程就装载你的Lisp文件,你这里的方法也是挺好的

cheng5276 发表于 2014-10-23 19:13:30

sieben 发表于 2014-10-23 15:49 static/image/common/back.gif
当然,如果你不打算在AutoCAD的启动过程就装载你的Lisp文件,你这里的方法也是挺好的
是的,如果无法判断CAD是否启动完毕,那我就不在启动时加载LSP,直接在后期按需加载了
页: [1]
查看完整版本: 请教c# 如何加载LSP、VLX等