在UG二次开发过程中我们需要为第三方插件配置环境变量让UG可以找到对应的文件,UG为用户提供的环境变量有:UGII_VENDOR_DIR、UGII_SITE_DIR、UGII_USER_DIR、UGII_GROUP_DIR(级别依次递减)。在电脑中添加环境变量只要右键点击我的电脑->属性->高级设置->环境变量,我们只需添加UGII_USER_DIR变量。
我们将开发好的插件(定制的菜单、工具栏、对话框、功能函数dll等文件)一起打包给用户,当用户拿到文件后可以放置在任意目录,然后右键点击我的电脑->属性->高级设置->环境变量,将当前目录添加给变量UGII_USER_DIR即可。为方便用户使用,我写个一个简单的设置环境变量程序SetUGEnv.exe,双击该应用就可以实现将当前目录配置到UGII_USER_DIR变量。
获取系统当前目录
操作很简单,这里我们要做的就是获取到当前文件存放目录,然后将该目录添加到环境变量中,这里我添加了一个判断,那就是如果该变量已经存在则提示用户变量值并提示是否继续配置环境变量。用到的头文件为#include ,获取当前目录我们可以使用GetCurrentDirectory(MAX_PATH,path)方法,返回操作系统的当前目录,参数有两个分别是指定缓冲区的长度和存储路径的字符串空间。
获取注册表信息
在设置环境变量之前我们现获取下环境变量中是否已存在UGII_USER_DIR变量,如果存在则告诉用户该变量指向哪个目录,这样用户只需要将我们的插件拷贝至相应目录即可,用户也可以选择是否继续注册当前目录给UGII_USER_DIR变量。查询注册表用到的是RegQueryValueEx方法,同样来至头文件#include 。
设置环境变量
这次主要是为了设置UGII_USER_DIR变量,所以我将UGEnv直接定义在函数里面了。这里主要是通过注册表进行环境变量的注册,所以我们需要通过RegOpenKeyEx先打开注册表并获取到句柄,然后通过句柄来操作该注册表的环境变量的注册。注册通过RegSetValueEx方法实现,最后记得RegCloseKey(hKey)关闭注册表生效配置信息。
HKEY hKey;//句柄const char *key = "SystemCurrentControlSetControlSession ManagerEnvironment"; //注册表路径RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ | KEY_WRITE, &hKey //打开注册表RegSetValueEx(hKey, UGEnv, NULL, REG_SZ, (const unsigned char *)path, strlen(path)); //设置注册表RegCloseKey(hKey); //关闭注册表
最后我们通过一个main函数将以上方法串起来就可以使用啦, 这里需要注意的是本次注册的是系统变量而不是用户变量。
遇到的错误和解决方案
如果遇到C2664错误提示:无法将参数 2 从“char *”转换为“LPCWSTR” ,点击决解方案中的项目属性->常规->字符集,将“使用Unicode字符集”改成“使用多字节字符集”即可解决该报错。
如果遇到C4996错误提示: This function or variable may be unsafe(此函数或变量可能不安全),我们可以在点击决解方案中的项目属性->C/C++->预处理器->预处理器定义中添加_CRT_SECURE_NO_WARNINGS定义即可。
更多C/C++实战技巧可参考专栏:C/C++实战系列