动态库安装中设置系统环境变量

来源:互联网 发布:sqlite3安装到windows 编辑:程序博客网 时间:2024/06/05 18:21

在做动态库的安装包时,一开始习惯将DLL拷贝到system32下,以方便用户直接使用Demo,即可运行成功,但是这种做法会要求向系统目录下拷贝一些公司自己写的dll和sys,有时还会被360当成恶意程序删除,这里有一种思路就是将dll安装到安装路径中,而不再拷贝到系统目录下,直接设置安装路径为系统环境变量,也可以使Demo成功运行。
平常提到的MFC以及Windows API编程都是通过动态链接库输出函数实现的。应用程序在调用这些函数的时候,会按照如下的顺序查找这些动态连接库文件:
(1)应用程序所在的当前目录
(2)Windows目录
(3)Windows系统目录
(4)系统环境变量指示的目录

如果在这些目录中找不到DLL文件,程序就会出现运行异常。所以,为了保证程序的正常运行,用户最好把需要的特定动态连接库放在程序所在的目录中,这样也可以避免各种潜在的覆盖冲突。

http://chinabin.bokee.com/6671374.html

使用环境变量
这部分内容不能用到下列项目中:

  • InstallScript
  • InstallScript Object
  • QuickPatch
  • Smart Device


环境变量是能够通过安装程序设置在目标系统上的一对名称和值,它能够被你的应用程序或者其他的程序访问。
Environment Variables视图中,你可以通过安装程序在目标系统上创建、设置(修改)和删除环境变量。也可以在视图中配置环境变量属性。
提示:对于Microsoft Windows 95或者98系统上,环境变量是在Autoexec.bat中创建、修改和删除的。在Windows NT4.0或者Windows2000或者更高的系统中环境变量是存储在注册表中的。

设置环境变量
这部分内容不能用到下列项目中:

  • InstallScript
  • InstallScript Object
  • QuickPatch
  • Smart Device


要创建一个新的环境变量或者修改该现有的环境变量值:
1、打开Environment Variables视图
2、右键单击EnvironmentVariables并选择AddEnvironment VariableInstallShield将添加一个默认名为 NewEnvironmentVariable x的新环境变量。输入你想创建、修改或删除的环境变量名。
3、在右边窗口的环境变量属性表中编辑属性

环境变量属性
通过配置环境变量属性,你可以指定你想在目标系统上如何编辑现有的环境变量或者创建一个新变量。每一个环境变量的描述如下:
  属性
    描述
    Component
    选择你想把这个环境变量关联的构件。如果选择的构件安装或者卸载,根据你在环境变量的属性表中的设置,目标系统上环境变量会被创建、修改或删除。单击省略号按钮打开浏览构件对话框。
    Value
    输入这个环境变量的路径或值。你可以使用预定义的路径,象[INSTALLDIR]Bin。要输入多个路径,使用分号分隔
  提示:如果On  Install 属性设置为RemoveValue属性会被清除并且变成只读。
    On Install
    指明在关联的功能部件在目标系统安装时的动作。选择下列中的一个:

  • Set-它与Placement属性协同工作,把Value设置成一个现有的环境变量。这个选项将在目标系统中没有指定的环境变量时创建一个环境变量,并且在安装期间进行设置。如果目标系统上已有指定的环境变量,它会在安装期间被设置。
  • Create-如果目标系统上没有指定的环境变量,将在目标系统上创建指定的环境变量并设置这个变量的值
  • Remove-从目标系统上删除环境变量
    Placement
    指明相对于现有的环境变量的值如何放置Value区域内的数据。选择下列选项中的一个:
  •   Append-这个选项把新值追加到现有环境变量值的后面
  •   Prefix-这个选项把新值放置到现有环境变量值的最前面
  •   Replace-这个选项用新值取代环境变量的原有值
  提示:如果你在On  Install属性中选择了Create并且指定的环境变量在目标系统上已经存在,这个Placement属性指明这个新值如何添加到现有的环境变量中或者是否替代现有的环境变量值。尽管这样,如果指定的环境变量如果在目标系统上不存在,它将被创建并且Placement的选项会被忽略。
    On Uninstall
    指明在关联的功能部件卸载时,环境变量是否从系统中删除。选择下面选项之一:
  •   Remove-这个选项是在关联的功能部件卸载时从目标系统上删除环境变量。如果On Install属性中设置的是Create,删除是删除整个环境变量。如果On Install属性中设置的是Set,删除是只删除变量值中追加的部分。
  •   Leave-这个选项是在关联的功能部件删除时在系统中保留环境变量或者追加的值。
    Type
    如果目标系统是Windows  NT 或者Windows  2000或者更高,这个属性指明环境变量的使用方式,是整个系统环境变量还是用户环境变量。如果目标系统是Windows9x,这个属性将被忽略。选择下列选项之一:
  System-创建修改或删除指定系统环境变量
  User-创建修改或删除用户环境变量。这个环境变量针对于那个用户运行的安装程序,即谁登录的系统。
  
环境变量示例

复制内容到剪贴板
代码:
/********************************************************************/

* The following code creates an environment variable under Windows NT

* for an entire system. You can modify the OnEnd event handler

* function block (or any other function block) to include this example

* code.

*

* NOTE: This code is only for InstallShield running on Windows NT.

* Also, the current user must have administrator privileges for this

* code to work.

/********************************************************************/

#define WM_WININICHANGE 0x001A

#define HWND_BROADCAST 0xffff

NUMBER nResult;

STRING szKey, szEnv;

POINTER pEnv;

begin

szKey = "SYSTEM//CurrentControlSet//Control//SessionManager//Environment";

RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);

nResult = RegDBSetKeyValueEx(szKey, "Fame", REGDB_STRING,"C://Test", -1);

if (nResult < 0) then

MessageBox("Failed to Set Environment Variable", WARNING);

else

MessageBox("Successfully Set Environment Variable",INFORMATION);

// Flush the NT registry to all applications.

szEnv = "Environment";

pEnv = &szEnv;

SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, pEnv );

endif;

// RebootDialog("", "", SYS_BOOTMACHINE);

end;
复制内容到剪贴板
代码:
/********************************************************************/

* The following code creates an environment variable under Windows NT

* for the current user. You can modify the OnEnd event handler

* function block (or any other function block) to include this example

* code.

*

* NOTE: This script is only for InstallShield running on Windows NT.

* Also, the current user must have administrator privileges for this

* code to work.

/********************************************************************/

#define WM_WININICHANGE 0x001A

#define HWND_BROADCAST 0xffff

NUMBER nResult;

STRING szKey, szEnv;

POINTER pEnv;

begin

szKey="Environment";

RegDBSetDefaultRoot(HKEY_CURRENT_USER);

nResult=RegDBSetKeyValueEx(szKey,"Fame",REGDB_STRING,"C://test",-1);

if (nResult < 0) then

MessageBox("Failed to Set Environment Variable",WARNING);

else

MessageBox("Successfully Set Environment Variable",INFORMATION);

// Flush the NT registry to all applications.

szEnv = "Environment";

pEnv = &szEnv;

SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, pEnv );

endif;

//RebootDialog("","",SYS_BOOTMACHINE);

end;