本文将讨论以下问题:

(1)Windows可执行程序会从哪些目录下加载DLL.

(2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录.

(3)可执行程序加载了不该加载的DLL.

(4)Win7,Win8下,"\Windows\System32"中的可执行程序无法加载DLL.

(1)

当启动一个可执行程序时,如果该程序需要加载其他DLL,那么当DLL的路径不是完整路径时,会先从当前目录下查找,找不到会再搜索系统目录,还是找不到的话,则依次搜索环境变量path的目录.这个顺序很重要.

我自己系统的默认环境变量path的目录如下:

C:\Program Files (x86)\Microsoft DirectX SDK (June 2007)\Utilities\Bin\x86;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files\TortoiseSVN\bin;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;;C:\Program Files (x86)\Microsoft Visual Studio 9.0\;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin

(2)

为了发布的软件目录清晰,我通常会将应用程序使用到的DLL放到一个统一的目录下,方法就是设置path环境变量.

在VC环境下可以通过以下代码设置path环境变量:

     // 设置Path环境变量
char szOldPathBuffer[] = { };
char szCurrPath[] = { };
char szNewPathBuffer[] = { };
::GetEnvironmentVariable("Path", szOldPathBuffer, sizeof(szOldPathBuffer));
::GetCurrentDirectory(sizeof(szCurrPath), szCurrPath);
::sprintf(szNewPathBuffer,
"%s\\ExternDll;%s",
szCurrPath, szOldPathBuffer); if(!::SetEnvironmentVariable("Path", szNewPathBuffer))
{
::MessageBox(NULL, szNewPathBuffer, "ERROR: Set Environment Failed!", );
}

(3)

这样做可能会碰到问题,就是应用程序加载了不该加载的DLL.

举个例子,应用程序中需要使用一个DLL为"physxcore.dll",将这个DLL放到某个path环境变量目录中.而用户的系统目录下恰好也存在一个physxcore.dll.如果两个physxcore.dll版本不一致,那么你的应用程序很可能无法启动,或者出现莫名其妙的问题.这是我亲身经历的问题,当时觉得很奇怪,若干台同样配置的机器,怎么就偏偏有一台不能运行呢?不知道这台机器装了什么软件,该软件将这个physxcore.dll放置到了系统目录下.解决办法就是将physxcore.dll放到与EXE文件同目录下.

(4)

我做过测试,如果将应用程序放到WIN7,WIN8的"\Windows\System32"目录下,它将不法加载任何DLL,无论是显示加载还是隐式加载.这个问题困扰了我很久,因为我写过几个屏保程序,这些程序在XP下设置屏保很正常,但Win7,Win8下就是无法运行.至今我也没有找到什么合理的解释.但可以将应用程序放到"\Windows\syswow64"或"\Windows\syswow32",程序放到这个目录下,也能够以屏保的方式运行.

关于Windows平台下应用程序加载DLL模块的问题.的更多相关文章

  1. 加载DLL模块

    关于Windows平台下应用程序加载DLL模块的问题. 本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE ...

  2. Windows x86 x64使用SetThreadContext注入shellcode的方式加载DLL

    一.前言 注入DLL的方式有很多,在R3就有远程线程CreateRemoteThread.SetWindowsHookEx.QueueUserApc.SetThreadContext 在R0可以使用a ...

  3. unity3d动态加载dll的API以及限制

    Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...

  4. Unity3D的坑系列:动态加载dll

    我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码 ...

  5. 无法加载Dll”ArcGISVersion.dll”:0x8007007E

    在Win7x64位环境下,无法加载Dll"ArcGISVersion.dll":找不到指定的模块 解决方案: 打开项目的属性-生成-常规-目标平台,选择X86. 参考:http:/ ...

  6. windows环境下memcache相关配置及PHP加载相应模块(php7版本)

    原文:https://blog.csdn.net/zhangatle/article/details/77504094 亲测安装成功 php 7.0 nts 86 第一步,首先下载windows版本的 ...

  7. WebKit 在 Windows 平台下编译小结

    虽然WebKit 已经越来越多的被广大程序员接受,但其编译过程却非常之痛苦.下面将我编译WebKit 代码的经验与大家分享. 1) 获取WebKit 源代码 WebKit 源代码是使用Subversi ...

  8. Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

  9. Windows平台下的读写锁

    Windows平台下的读写锁简单介绍Windows平台下的读写锁以及实现.背景介绍Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(Initialize ...

随机推荐

  1. 十个 MongoDB 使用要点

    转自: 十个 MongoDB 使用要点    从 mongodb 阶段性技术总结 中抽取并整理了对大家有帮助的十个要点:   1.mongodb 表名和字段名统一用小写字母 mongodb 是默认区分 ...

  2. 剑指offer系列59---寻找丑数

    [题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...

  3. IAR Embedded Workbench IDE 显示行号

    第一次使用IAR Embedded Workbench IDE,默认设置是不现实代码行号的.显示代码行号方法如下:首先选择“Tools”菜单项,打开“IDE Option”对话框,然后在树状图中选择“ ...

  4. PHP写一段代码,确保多个进程同时写入一个文件成功

    这个需求是在软件设计过程常见的加锁.学计算机的同学都应该知道,这个是在<计算机操作系统>课程上有这个知识点.主要要考虑的是进程的同步,也就是进程对资源的互斥访问.OK,用程序说话吧! &l ...

  5. 5. redis管道, 发布订阅, 模拟队列

    一. 发布订阅 #订阅scribe 127.0.0.1:6379> SUBSCRIBE "channel_1" Reading messages... (press Ctrl ...

  6. (C/C++) Interview in English - Basic concepts.

    Question Key words Anwser A assignment operator abstract class It is a class that has one or more pu ...

  7. POJ 1185 炮兵阵地(状态压缩DP)

    题解:nState为状态数,state数组为可能的状态 代码: #include <map> #include <set> #include <list> #inc ...

  8. python(17) 获取acfun弹幕,评论和视频信息

    每天一点linux命令:新建文件夹

  9. Yii2.0 实现三级联动 [ 2.0 版本 ]

    view中代码 <?php use yii\bootstrap\ActiveForm; /* @var $this yii\web\View */ /* @var $form yii\boots ...

  10. Objective-C: 字符串NSString与NSMutableString

    字符串算是OC中非常重要和常用的一部分内容,OC中的字符串与我之前在学习C,C++,Java中的字符串有一定的不同,它非常类似于C++中容器的概念,但用法却与之还是有很大的不同,也许是因为OC的语法就 ...