关于DLL的delay load: http://msdn.microsoft.com/en-us/library/151kt790.aspx

最近在做GLES的shader compiler, 把现有的HLSL转成GLSL.

因为ShaderResource是定义在Graphics Subsystem, 而Graphics 是一个插件, 放在Tools\Plugins\下面

而转shader换过程中, shader compiler需要直接依赖Shader Resource, 所以要链接BladeGraphics.xxx

这个时候问题出现了, 如果是程序自己手动加载DLL, 那么可以指定搜索路径,

但是对于直接链接的DLL的import lib(.lib)的程序, windows系统只会在以下地方搜索依赖(http://msdn.microsoft.com/en-us/library/aa297182(v=vs.60).aspx):

1.当前进程的EXE所在文件夹

2.当前路径(cwd / GetCurrentDirectory)

3.windows 系统路径: GetSystemDirectory()

4.windows所在路径: GetWindowsDirectory ()

5.环境变量PATH中

显然我需要的路径是.\Plugins (对应的绝对路径)

但是直接执行exe的时候不能设置路径, 导致运行exe系统提示找不到该DLL.

解决办法之一是把这个插件从.\Plugins\ 下面复制到.\下面, 但是对现有的维护很不方便.

其实BladeGraphics这个插件,程序在运行时是会指定路径, 手动加载它的, 但是现在编译shader用的是它的导出类, 为了方便, 需要直接连接它的import lib, 所以执行/加载EXE时, 系统立即自动加载DLL并连接IAT

正是由于这个插件在启动后也会立马被手动加载, 所以想到了对该DLL进行延迟加载, 这样系统不会在启动程序时立即查找该DLL, 而是在第一次调用该DLL内函数时尝试加载,

而在第一次调用DLL函数的时候, 这个插件实际上已经被程序手动加载了, 系统检测到以后什么事情都不会做.

关于import lib, 是在启动时自动做了LoadLibrary, 和GetProcAddress(), 把目标DLL中所有的导出函数都连接到lib自定义的函数.因为lib不是一个Module,他会最终被静态链接到Client EXE/DLL中, 而Client EXE/DLL在调用lib中定义的函数时, 该函数则跳转到GetProcAddress()获取的, 目标DLL中的地址.

引擎设计跟踪(九.14.2e) DelayLoaded DLLs (/DELAYLOAD)的更多相关文章

  1. 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复

    由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...

  2. 引擎设计跟踪(九.14.2i) Android GLES 3.0 完善

    最近把渲染设备对应的GLES的API填上了. 主要有IRenderDevice/IShader/ITexture/IGraphicsResourceManager/IIndexBuffer/IVert ...

  3. 引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio

    最近在做纹理压缩工具, 以及数据包的生成. shader编译已经在vs工程里面了, 使用custom build tool, build命令是调用BladeShaderComplier, 并且每个文件 ...

  4. 引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools

    之前骨骼动画的IK暂时放一放, 最近在搞GLES的实现. 之前除了GLES没有实现, Android的代码移植已经完毕: [原]跨平台编程注意事项(三): window 到 android 的 移植 ...

  5. 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014

    Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/ 简译 translation: 作者在2012年写 ...

  6. 引擎设计跟踪(九.14.3.4) mile stone 2 - model和fbx导入的补漏

    之前milestone2已经做完的工作, 现在趁有时间记下笔记. 1.设计 这里是指兼容3ds max导出/fbx格式转换等等一系列工作的设计. 最开始, Blade的3dsmax导出插件, 全部代码 ...

  7. 引擎设计跟踪(九.14.2 final) Inverse Kinematics: CCD 在Blade中的实现

    因为工作忙, 好久没有记笔记了, 但是有时候发现还得翻以前的笔记去看, 所以还是尽量记下来备忘. 关于IK, 读了一些paper, 觉得之前翻译的那篇, welman的paper (http://gr ...

  8. 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言

    Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...

  9. 引擎设计跟踪(九.14.2b) 骨骼动画基本完成

    首先贴一个介绍max的sdk和骨骼动画的文章, 虽然很早的文章, 但是很有用, 感谢前辈们的贡献: 3Ds MAX骨骼动画导出插件编写 1.Dual Quaternion 关于Dual Quatern ...

随机推荐

  1. Sublime Text2 注册码 汉化 配置lua开发环境

    1.注册  help --> Enter License ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-8556 ...

  2. PHP截取字符串 兼容utf-8 gb2312

    <?php function subString($string,$length,$append = false) { if(strlen($string) <= $length ) { ...

  3. Python核心编程--学习笔记--8--条件与循环

    本章讲述if.while.for以及与他们搭配的else.elif.break.continue.pass等语句. 1 if语句 语法:三部分——关键字if.条件表达式.代码块.(记住冒号) if c ...

  4. C扩展 从共享内存shm到memcache外部内存

    引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面 ...

  5. 1008. Elevator (20)

    The highest building in our city has only one elevator. A request list is made up with N positive nu ...

  6. QPBOC扩展应用交易流程

    1 Q扩展部分数据 增加3个DGI,分别为:A001,8020,9020 9103中增加DF60(9F38中),DF61 增加DF62,DF63 1.1  A001扩展应用配置 DGI 长度 值(示例 ...

  7. struts2框架基本操作总结

    struts技术说明 一:第一配置开发环境 1.struts.xml文件 <?xml version="1.0" encoding="UTF-8" ?&g ...

  8. 未能加载文件或程序集“System.Web.Razor”或它的某一个依赖项。文件或目录损坏且无法读取。

    “/”应用程序中的服务器错误. 未能加载文件或程序集“System.Web.Razor”或它的某一个依赖项.文件或目录损坏且无法读取. (异常来自 HRESULT:0x80070570) 说明: 执行 ...

  9. C++11 常用语法

    1 新类型 C++ 11新增了long long和unsigned long long,以支持64bit宽度: 新增char16_t和char32_t以支持16位和32位字符表示: 增加了“原始”字符 ...

  10. 28335timer

    /*****************************************************************************Copyright: 2014,TkaiFi ...