- UID
- 33731
- 积分
- 1055
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-3-6
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
我们知道在进行CAD二次开发中LISP语言中,对程序的定位是有很大困难的。现在大部分程序都是通过向CAD支持目录中添加自己的程序目录来实现。而在程序内部调用时均不指定目录,只有文件名,这在块的引用,程序的调入,幻灯片的显示都存在很多问题,当ACAD目录中有与你调用相同的文件时,它可能会调用并不是你想要的文件。
我在使用过程中使用了天正的方法。即在程序安装时将安装目录信息保存在注册表中。而在CAD启动过程中装载程序时将注册表中的目录信息读入目录变量。而在所有对文件的调入、块文件的插入等都在文件名前加入目录信息。这样所有的文件都能顺利载入啦。
实现方法有两种:
第一种:使用其他高级语言编程单独实现。
我用的是VC,思路:
先用GetModuleFileName来获取文件当前目录。
然后再用
RegCreateKeyEx
RegSetValueEx
RegCloseKey
来将其写入注册表中你需要的位置上
[php]
// setdir.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <string.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
//获取当前目录。
TCHAR exeFullPath[MAX_PATH];
long ret0=::GetModuleFileName(NULL,exeFullPath,MAX_PATH);
if(ret0==ERROR_SUCCESS)
{MessageBox (NULL, TEXT ("目录太长,无法获取当前目录!"), TEXT ("错误"), 0);
return 0;
}
char *p;
//分离路径和文件名。
p = exeFullPath;
while(strchr(p,'\\')) {
p = strchr(p,'\\');
p++;
}
*p = '\0';
//创建[蜜蜂软件]主健
HKEY hOpenedKey;
LPCTSTR data_Set="Software\\蜜蜂软体\\";
DWORD dwDisposition;
//DWORD dwLastError;
BOOL bRet =::RegCreateKeyEx(HKEY_LOCAL_MACHINE,
data_Set, //lpszSubKey
0,
"RegApp", //(char *) lpszClass,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hOpenedKey,
&dwDisposition
);
if(bRet!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行
{
MessageBox (NULL, TEXT ("无法打开有关的hKEY!"), TEXT ("错误"), 0);
return 0;
}
long ret2=::RegSetValueEx(
hOpenedKey,
"NetBee_Dir",
NULL,
REG_SZ,
(LPBYTE)exeFullPath,
ret0
);
if(ret2!=ERROR_SUCCESS)
{
MessageBox (NULL, TEXT ("无法修改有关注册表信息!"), TEXT ("错误"), 0);
return 0;
}
::RegCloseKey( hOpenedKey );
return 0;
}
[/php]
大家用VC编译后将其放在你的程序目录中,并设置为在安装后自动运行即可。
=================================
第二种:不用编程,而是在inno setup安装制作软件中使用[Registry]段直接进行注册表的添加
[Registry]
Root: HKLM;Subkey: "Software\蜜蜂软体";Flags: createvalueifdoesntexist
Root: HKLM;Subkey: "Software\蜜蜂软体";ValueType: string; ValueName: "NetBee_Dir"; ValueData: "{app}"
………这里还可添加其他你需要的子项
说明:
目录常量
{app}
用户在安装向导中的选择目标位置页中选定的应用程序目录。
例如: 如果你在项目中指定了 {app}\MYPROG.EXE,用户选择了“C:\MYPROG”作为应用程序目录,安装程序将该文件安装到“C:\MYPROG\MYPROG.EXE”。
----------------------------------------
然后在你的加载菜单程序*.MNL中添加如下语句:

- (DEFUN Netbee_load (file)
- (IF (= (LOAD (STRCAT Netbee_Lisp_Dir file) "BAD") "BAD")
- (ALERT (STRCAT "警告:\n文件装载失败:\n" file))
- ) ;_ end of if
- ) ;_ end of defun
- (setq Netbee_Dir
- (vl-registry-read
- "HKEY_LOCAL_MACHINE\\Software\\蜜蜂软体"
- "Netbee_Dir"
- )
- )
- (IF (NOT Netbee_Dir)
- (progn(PROMPT "\n [基础绘图系统]装载失败!")
- (EXIT))
- (Progn
- (setq NetBee_Lisp_Dir (strcat Netbee_Dir "lisp\")
- NetBee_Sys_Dir(strcat Netbee_Dir "Sys\")
- Netbee_Block (STRCAT Netbee_Dir "BLOCK\")
- )
- )
- ) ;_ end of if
对于所有的LISP文件调用均用Netbee_load函数
(Netbee_load "netbeelib")
而块的插入均使用Netbee_Block变量加文件名的方式。
这样你的程序在调用中再也不会出错啦。
=============
有些网友对VC不了解,那么下载下面的附件,用VC打开后将其中关于子键及目录名改为你想要的,然后按Release方式编译即可。不要用DEBUG方式编译,不然文件会很大的。 |
|