明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

楼主: 秋枫

[资源] AutoCAD二次开发安装程序制作(2011-04-20)

    [复制链接]
发表于 2005-5-28 20:05 | 显示全部楼层
版主,请您帮个忙,告诉我怎样把菜单组加入注册表的


你就以2002做个例子吧


小弟先谢谢你了


小弟急需
 楼主| 发表于 2005-5-28 21:33 | 显示全部楼层
将菜单组加入注册表一般用LISP或VBA实现比较保险。我的新的安装程序并不做这个工作。直接修改注册表的做法我只能给你一个Delphi的例子,仅供参考:
  1. procedure RemoveMenuGroup(const AutoCADProductKey, MenuGroup:String);
  2. var Profiles: TStringList;
  3.        MenuGroupValues: TStringList;
  4.        i,j:integer;
  5.        MenuGroupFound: boolean;
  6.        Reg: TRegistry;
  7. begin
  8.    MenuGroupFound:=false;
  9.    Profiles:= TStringList.Create;
  10.    MenuGroupValues := TStringList.Create;
  11.    Reg:=TRegistry.Create;
  12.    try
  13.        Reg.RootKey := HKCU;
  14.        Reg.OpenKey(AutoCADProductKey+'\Profiles', false);
  15.        Reg.GetKeyNames(Profiles);
  16.        Reg.CloseKey;
  17.        for i := 0 to Profiles.Count-1 do
  18.        begin
  19.            if Reg.KeyExists(AutoCADProductKey+'\Profiles\'+Profiles[i]+'\Menus') then
  20.            begin
  21.                MenuGroupValues.Clear;
  22.                Reg.OpenKey(AutoCADProductKey+'\Profiles\'+Profiles[i]+'\Menus', true);
  23.                j := 1;
  24.                While Reg.ValueExists('Group'+IntToStr(j)) do
  25.                begin
  26.                    MenuGroupValues.Add(Reg.ReadString('Group'+IntToStr(j)));
  27.                    inc(j);
  28.                end;
  29.                for j := MenuGroupValues.Count - 1 downto 0 do
  30.                begin
  31.                    if UpperCase(MenuGroupValues[j]) = UpperCase(MenuGroup) then
  32.                    begin
  33.                        MenuGroupValues.Delete(j);
  34.                        MenuGroupFound:=true;
  35.                    end;
  36.                end;
  37.                If MenuGroupFound then
  38.                begin
  39.                    j:=1;
  40.                    While Reg.ValueExists('Group'+IntToStr(j)) do
  41.                    begin
  42.                        Reg.DeleteValue('Group'+IntToStr(j));
  43.                        inc(j);
  44.                    end;
  45.                    for j := 0 to MenuGroupValues.Count -1 do
  46.                    begin
  47.                        Reg.WriteString('Group'+IntToStr(j+1), MenuGroupValues[j]);
  48.                    end;
  49.                end;
  50.                Reg.CloseKey;
  51.            end;
  52.        end;
  53.    finally
  54.        Profiles.Free;
  55.        MenuGroupValues.Free;
  56.        Reg.Free;
  57.    end;
  58. end;
  59. procedure AddMenuGroup(const AutoCADProductKey, MenuGroup:String);
  60. var Profiles: TStringList;
  61.        i,j:integer;
  62.        Reg: TRegistry;
  63. begin
  64.    RemoveMenuGroup(AutoCADProductKey, MenuGroup);
  65.    Profiles:= TStringList.Create;
  66.    Reg := TRegistry.Create;
  67.    try
  68.        Reg.RootKey := HKCU;
  69.        Reg.OpenKey(AutoCADProductKey+'\Profiles', false);
  70.        Reg.GetKeyNames(Profiles);
  71.        Reg.CloseKey;
  72.        for i := 0 to Profiles.Count-1 do
  73.        begin
  74.            if Reg.KeyExists(AutoCADProductKey+'\Profiles\'+Profiles[i]+'\Menus') then
  75.            begin
  76.                Reg.OpenKey(AutoCADProductKey+'\Profiles\'+Profiles[i]+'\Menus', true);
  77.                j:=1;
  78.                While Reg.ValueExists('Group'+IntToStr(j))
  79.                              and (Reg.ReadString('Group'+IntToStr(j)) <> '') do inc(j);
  80.                Reg.WriteString('Group'+IntToStr(j), MenuGroup);
  81.                Reg.CloseKey;
  82.            end;
  83.        end;
  84.    finally
  85.        Profiles.Free;
  86.        Reg.Free;
  87.    end;
  88. end;
复制代码
发表于 2005-5-29 00:15 | 显示全部楼层
要是用lisp修改注册表


怎么才能让autocad在启动时就加载菜单组啊?


比如你以前提供的文字修改大师中ctt.mns


怎么使autocad         在启动时就加载他呢?


谢谢你
 楼主| 发表于 2005-5-29 15:00 | 显示全部楼层
用vlisp的话,不需要修改注册表。


用(command "menuload" ...)即可。我提供的样例程序中有详细的例子。
发表于 2005-5-29 18:52 | 显示全部楼层
我想在打开autocad时就自动加载菜单,就和你哪个安装程序一样


如果我用vlisp写的话它不是不能加载吗
发表于 2005-5-29 19:15 | 显示全部楼层
如果写在lsp(mnl)文件中



只有加载了菜单文件, mnl文件才能加载


那菜单文件有怎么加载呢
 楼主| 发表于 2005-5-29 22:57 | 显示全部楼层
这需要打开AutoCAD时自动运行那个lsp文件。


这个可以通过写入注册表实现。


找到AppLoad的Startup表,加一条就行了。
发表于 2005-5-29 23:22 | 显示全部楼层
大哥


以CAD2002举个例子好吗?
 楼主| 发表于 2005-5-30 21:06 | 显示全部楼层
本帖最后由 作者 于 2005-5-30 21:26:33 编辑

我系统中没有安装2002,无法详细说明,以2006为例,这个与2002的注册表结构是差不多的。



遍历的Innosetup源代码你可以参考本主题的4楼。





如图所示:注册表路径(2002的注册表路径就是R16.0下面了):


HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R16.2\ACAD-4001:409\Profiles\&lt;&lt;Unnamed Profile&gt;&gt;\Dialogs\Appload\Startup





其中,路径中的"ACAD-4001:409"与“&lt;&lt;Unnamed Profile&gt;&gt;”名称分别需要遍历R16.2键与Profiles键的子键得到,因为不同的系统不同的AutoCAD版本这个值是不同的,因此你至少需要在你的安装程序中有3循环,第一层是版本级,比如R16.0, R16.1, R16.2,第二层是同一版本级,比如AutoCAD 2000与2002的区别(它们都是16.0级下的),中文版2002与英文版2002及其它语言版本的区别都是在这一级,第三层是Profiles级,同一个AutoCAD下的不同配置,比如一些二次开发软件采用不同的Profiles。


最后,对于每个循环下找到的这个键Dialogs\Appload\Startup,下面有两个值(如果键不存在,可以创建之)


NumStartup表示一共有几个开始时自动加载的程序


然后是第一个程序1Startup,第二个程序2Startup,第三个程序……依次类推。


你可以考虑把NumStartup增加1,然后自己添加一项NStartup(N表示你的NumStartup值),当然安全一点的你应该考虑看看是否已经添加了,卸载时也要考虑恢复原状的问题。


为了保证你的程序能加载,还需要通知AutoCAD启动时加载Appload模块。


找到如图所示的位置(同样也需要遍历),读取LoadCtrls的值,将这个值与2作“或”运算,再写回。这样可以保证AutoCAD启动时会加载Appload.arx模块。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2005-5-30 21:13 | 显示全部楼层
另外关于加载菜单组的问题你可以看看各个Profile下面的Menus键。做法也是类似的。你如果不想通过lisp程序加载菜单组,那么你需要修改这下面的键值。


R14与R15有所不同,但大致相同。


R15.0~R16.1这下面大概是差不多的。


R16.2(AutoCAD 2006)这下面有很大的区别,你可以自己研究一下(我没有研究过)。


       


当然,最简单的办法还是使用我提供的通用安装程序,告诉我的安装程序你启动时自己加载哪个lsp程序,然后在这个lsp中加载菜单组(这种做法目前2006与2005还是兼容的)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2018-4-23 04:18 , Processed in 0.186391 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表