• 加载DLL模块


    关于Windows平台下应用程序加载DLL模块的问题.

    本文将讨论以下问题:

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

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

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

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

    (1)

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

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

    C:Program Files (x86)Microsoft DirectX SDK (June 2007)UtilitiesBinx86;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program Files (x86)IntelOpenCL SDK2.0inx86;C:Program Files (x86)IntelOpenCL SDK2.0inx64;C:Program FilesTortoiseSVNin;c:Program Files (x86)Microsoft SQL Server100ToolsBinn;c:Program FilesMicrosoft SQL Server100ToolsBinn;c:Program FilesMicrosoft SQL Server100DTSBinn;c:Program Files (x86)Microsoft SQL Server90Toolsinn;;C:Program Files (x86)Microsoft Visual Studio 9.0;C:Program Files (x86)Microsoft Visual Studio 9.0VCin

    (2)

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

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

    复制代码
     1     // 设置Path环境变量
     2     char szOldPathBuffer[4096] = { 0 };
     3     char szCurrPath[256] = { 0 };
     4     char szNewPathBuffer[4096] = { 0 };
     5     ::GetEnvironmentVariable("Path", szOldPathBuffer, sizeof(szOldPathBuffer));
     6     ::GetCurrentDirectory(sizeof(szCurrPath), szCurrPath);
     7     ::sprintf(szNewPathBuffer, 
     8         "%s\ExternDll;%s", 
     9         szCurrPath, szOldPathBuffer);
    10 
    11     if(!::SetEnvironmentVariable("Path", szNewPathBuffer))
    12     {
    13         ::MessageBox(NULL, szNewPathBuffer, "ERROR: Set Environment Failed!", 0);
    14     }
    复制代码

    (3)

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

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

    (4)

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

     
     
    分类: 其他
  • 相关阅读:
    Python从菜鸟到高手(18):类与方法的私有化
    小程序云开发实战
    第一行代码:以太坊(3)-使用更多的工具编写和测试智能合约
    第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
    第一行代码:以太坊(1)-创建自己的私有区块链
    用量子物理学原理解释为什么振金可以吸收能量(论发散思维的重要性)
    Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布
    Python从菜鸟到高手(8):print函数、赋值与代码块
    基于ArcPy的ArcGIS python设计与开发实战--GIS二次开发
    tensorflow数据增强
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3466663.html
Copyright © 2020-2023  润新知