今天看啥
热点:

Path环境变量包含不存在的路径时对dll搜索的影响,path环境变量


  在Windows中,根据MSDN的文档,某些情况下应用程序运行时会在Path环境变量指定的目录中搜寻它需要的dll。那么如果Path中包含一个不存在的路径,Windows会如何处理这种情况?我本以为这些路径会被忽略,然后Windows会继续搜索,后来发现其实不然。至少在Windows 7上,cmd和Msys的行为不完全是这样。


  假设我有一个应用程序conftest.exe,它依赖于SDL.dll;并且假设SDL.dll放在Path包含的某个目录中。在正常情况下,我在cmd中运行conftest.exe,它会正常运行正常退出,没有任何错误提示。


  但是如果我在运行conftest.exe前,通过命令在Path变量的开头添加一个不存在的路径(比如NONE),那么conftest.exe在运行时就会报一个找不到SDL.dll的错误


> set path="NONE;%path%"

> conftest

弹框提示找不到SDL.dll。)


  但是将NONE放在Path的结尾却不会有这个问题:


> set path="%path%;NONE"

> conftest

(正常运行。)


  Msys也是如此;而且在PATH的开头添加NONE之后,就必须通过./conftest这样的形式来启动程序了,即必需指定conftest.exe所在的目录,不能省略./;另外在conftest.exe报错退出后,通过echo $?可发现conftest.exe的返回值为53:


$ export PATH="NONE;$PATH"


$ conftest

sh: conftest: command not found


$ ./conftest

(弹框提示找不到SDL.dll。)


$ echo $?

53


  但奇怪的是,如果我通过Windows系统属性对话框中的环境变量设置(方法是右键单击开始菜单中的“计算机”->“属性”->“高级系统设置”->“环境变量”)在Path的开头添加NONE,却不会有这个问题,conftest.exe还是能找到SDL.dll,正常运行。

 

  可见在cmd和Msys中,应用程序在Path中搜索dll时,遇到一个不存在的路径就会停止搜索。


  有意思的是,在Msys中,如果在PATH中添加的不存在路径是一个绝对路径,那就不会有问题:


$ export PATH="/NONE;$PATH"


$ conftest

(正常运行。)


$ echo $?

0


$ ./conftest

(正常运行。)


$ echo $?

0


---------------------------------------------------------------------------------------------------------------------------------------


  之所以会研究这个问题,是因为最近我用MinGW+Msys构建一个开源项目时,总是遇到找不到dll的错误。经过研究发现是configure运行的时候会生成并运行一些名字叫conftest.exe的可执行文件,用来测试系统上是否安装了某些库或具有某些特性,而conftest.exe可能会依赖于某些dll。但奇怪的是,这些dll就在PATH中,而且如果我根据config.log单独构建出conftest.exe,并且按照config.log中记录的命令单独在终端中(不通过configure)运行它的话,就不会遇到找不到dll的错误。因此我想肯定是configure做了点什么。


  果然,后来发现configure在运行conftest.exe之前,会将$prefix/bin和$prefix/usr/bin添加到PATH的开头:


PATH="$prefix/bin:$prefix/usr/bin:$PATH"


  而如果用户在运行configure时没有指定--prefix,此时$prefix的值就是NONE,于是这就是两个不存在的目录,影响了dll的搜索。这个链接里也提到了prefix为NONE的事,摘录如下:


Autoconf initialises `prefix=NONE', then resets it to what the user gave as the `--prefix=/some/path' argument. If the user doesn't specify such an argument, then it remains set as `NONE' to the end of the configure script, eventually being replaced by `prefix=$ac_default_prefix' in config.status, just before generating the AC_CONFIG_FILES; this allows your configure script to check, at any time, whether or not the user specified `--prefix=/some/path', (e.g. with `test "$prefix" = NONE', although AFAIK this feature is undocumented).  


设置系统的环境变量PATH后,注册DLL文件时未先去PATH里寻找,而是先从本地寻找此文件

◥◣ 系统的环境变量似乎只支持可执行文件,如exe,com,scr,bat,cmd等.

dll应该是不被支持的.系统环境变量有两种,一种是win32应用的,一种cmd命令行下的,

设置不当会寻找错误.另外,使用命令行注册也比较好用: regsvr32 /s 路径\文件名

另外,你可以将注册dll项集成在右键,这样会方便很多.

方法是新建文档并命名为: regdll.reg,双击导入便可以集成,内容如下:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\dllfile\shell\注册组件\command]
@="Regsvr32 /s \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\shell\注册组件\command]
@="Regsvr32 /s \"%1\""
[HKEY_CLASSES_ROOT\dllfile\shell\卸载组件\command]
@="Regsvr32 /u \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\shell\卸载组件\command]
@="Regsvr32 /u \"%1\""
 

操作系统环境变量设置过多,有什坏处实际就是问环境变量的工作原理比如说path,比如说新建的

当在命令行下输入可执行程序的时候,操作系统会按照自定的顺序去寻找,比如,先看当前路径有没有,若不存在则会到各系统路径去寻找,环境变量就是其中一个。
当然,并不仅仅只是执行程序或命令的时候使用环境变量路径,在程序加载过程中一些动态链接库,如DLL文件,搜索路径链都是会包括环境变量的。
设置过多就会增加程序启动的初始化时间,当然,这是理论上的,按照现在的计算机硬件水平,设置较多环境变量路径不会对性能造成影响。
 

www.bkjia.comtruehttp://www.bkjia.com/xtzh/892983.htmlTechArticlePath环境变量包含不存在的路径时对dll搜索的影响,path环境变量 在Windows中, 根据MSDN的文档,某些情况下应用程序运行时会在Path环境变量指...

相关文章

相关搜索: path dll 环境变量

帮客评论

视觉看点