关于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. C++判断五位以内的对称素数

    题目内容:判断一个数是否为对称且不大于五位数的素数. 输入描述:输入数据含有不多于50个的正整数n(0<n<232). 输出描述:对于每个n,如果该数是不大于五位数的对称素数,则输出“Ye ...

  2. Spark官方文档——本地编写并运行scala程序

    快速开始 本文将介绍如何用scala.java.python编写一个spark单击模式的程序. 首先你只需要在一台机器上成功建造Spark:做法: 进入Spark的根目录,输入命令:$ sbt/sbt ...

  3. WebService IIS 部署

    刚刚开始接触c#怎么发布程序都搞不定,经过查看网上同仁的资料,自己写了个Webservice发布了下 1.首先自己写好程序,鼠标选中所写Webservice程序,单击鼠标右键-------->发 ...

  4. 如何让dapper支持oracle游标呢?

    Dapper是一个轻型的ORM类.它有啥优点.缺点相信很多朋友都知道了,园里也有很多朋友都有相关介绍,这里就不多废话. 如果玩过Oracle都知道,存储过程基本都是通过游标返回数据的,但是dapper ...

  5. Mongodb初学习--安装、试用

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 在MongoDB中数据被分组存储在数据集中,被称为一个集合(Collection ...

  6. clojure

    ide http://updatesite.ccw-ide.org/stable https://cursiveclojure.com/ http://web.clojurerepl.com/ htt ...

  7. 扯一扯前端css的整体架构设计:(2)base基础类的那些事儿

    周一下午在实验室写了第一篇博文,有几个人捧场,那咱就得接着下去啊.然后我觉得现在写的内容更多的偏向于谈一下我对于前端css架构的理解和前端经验的一个小总结,所以就把标题里原来的[项目总结]给删掉了.但 ...

  8. Android体系结构

    由图可知,android被分成4个层次,以linux为核心,针对手机进行专门的优化,提供了android操作系统最基本的功能,在此之上又分为android runtime和libraries.其中Da ...

  9. 【转】oracle connect by用法

    今天偶然看到connect by,但记不太清楚具体用法了.转了个博客(写的蛮好的),当作笔记. http://www.cnblogs.com/linjiqin/p/3152690.html 先用sco ...

  10. Android中使用WebView, WebChromeClient和WebViewClient加载网页

    在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持, 其中webView的一系列用法,比如 webView.getSettings().s ...