本帖最后由 zhouzhipen 于 2012-08-28 18:29:25 编辑

解决方案 »

  1.   

    XP是不是不支持延迟加载?
    我曾经做过测试,vs2008 + XP,选上延迟加载,又选了另外一个选项,忘记了
    最后在dllmain中发现,并没有延迟加载同样的问题也出现在随机化基址上
      

  2.   

    还有一个方法
    延迟加载
    然后
    BOOL WINAPI SetDllDirectory(
      __in_opt  LPCTSTR lpPathName
    );
      

  3.   

    感谢cadinfo 指出一处书写错误:
    m_Modeules.pop_back(hModule);
    改为
    m_Modeules.push_back(hModule);
      

  4.   


    这种方法,好像只能增一个目录中吧,如果多个目录中有DLL就没办法了。
      

  5.   

    将DLL放到不同目录后,CRT运行库的问题怎么解决的?
    直接安装的CRT发布包?还是在每个目录下拷贝一份CRT的文件?
      

  6.   

    lz不是说了么,一些关键的dll不适应这个方法~~~
      

  7.   

    你没懂我的意思吧,CRT直接放到exe主目录下,DLL目录下的DLL是找不到CRT的哦
      

  8.   


    不会的,CRT的DLL在exe启动时已经被加载了,DLL是不会再加载的。
      

  9.   

    我用的是 VS2008 编译器,按照你的方法加载的DLL,但是 LoadLibrary 在加载分目录下的DLL时直接失败,GetLastError 返回 14001(应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。)。
    然后我把运行库拷到该分目录下,运行就正常了!
    你用的是不是干净的系统呀,我用的干净的虚拟机的
      

  10.   

    难道你的exe不需要加载CRT?或者EXE与DLL不是同一版本的编译器编译的?
      

  11.   

    VS2008的话需要 对应版本的dll以及 manifest 。
      

  12.   

    这个我喜欢哈哈哈哈!
    只需要改调用者程序为延迟加载? DLL不用了把?
      

  13.   

    本身设计就有问题 非要搞个不正常的规则来加载dll,只会带来更多麻烦,维护也困难。设计应该尽量简单。
      

  14.   

    就是稍微重构了下LoadLibrary和FreeLibrary?
      

  15.   

    搞不懂意义何在。把所有的dll都事先统一注册,那又如何。更何况动态加载的意义就是需要时才加载。你这样做了,其实就等于静态加载。
      

  16.   


    跟我思路一样.load dll.自己指定目录.而已.比静态连接.还麻烦.一个一个加dll.写代码
    不如统统dll丢进一个目录.hook loadlibray加载,参数改dll路径,一劳永逸..比如某些病毒技术.
      

  17.   

    延时加载不是操作系统提供的功能,是编译器的支持。
    这里有篇较老的文章:http://www.microsoft.com/msj/1298/hood/hood1298.aspx楼主的作法可以实现功能,但是违背了delay load的真正作用。楼主的功能不用这么麻烦,编译器为了支持delay load,提供了专门的头文件来方便开发同学对delay load 的hook功能。
    具体见DELAYIMP.H
      

  18.   

    100个dll这样加啊?还不如改下系统的PATH变量呢。
      

  19.   

    对于延迟加载,可以考虑使用AddDllDirectory添加,不过前提条件是要求LoadLibraryEx带了参数LOAD_LIBRARY_SEARCH_USER_DIRS,且此之前添加路径。
      

  20.   


    思路不错哦。用过使用xml配置文件的方法来Load大量DLL
      

  21.   

    http://www.cnblogs.com/FCoding/archive/2012/08/15/2640989.html 这个可以胜任,支持相对路径,和绝对路径
      

  22.   


    我也不知道是我SB还是这帖子的人都SB,竟然都认为这个是隐匿链接?
    难道CSDN这么多SB?
      

  23.   


    好久没来了,想不到有这么多人关注,尤其这位仁兄,不要以为别人都是“SB”只有就你能看出来问题。这种方法的好处就是:你不用显式获取函数指针,而由编译器自动隐式链接到需要使用的函数。如果您不能明白所说好处,则说明还没有使用过DLL。