1. lib库导入依赖:A项目代码编译的时候就需要依赖B项目的lib文件,运行时需要依赖B的dll,不管是不是实际使用B的函数,A运行时肯定会在自己的内存空间中装载B。lib库导入依赖会有两种特殊情况:a)作为一种优化变种,dll可以延迟加载,为此在A的二进制文件中会有一个延迟加载入口表;b)A确实在代码中使用了B的方法b,但b只是调用C的c的一个二传手,那么B和C都是A必须依赖的,可只有B会出现在A的导入入口表中;
2.LoadLibrary依赖:A模块的入口表格中没有B的信息,因此在build和运行过程中不需要B的lib文件, 使用LoadLibrary和GetProcAddress、FreeLibrary这些系统API来使用其他模块。 此类用法常见于对OCXs, COM对象, 和Visual Basic应用。
3. 注入依赖。当B用钩子挂在A的进程中的某个特定事件e上。一旦A的进程产生e,则OS注入一个模块B到进程内部处理该事件。A虽然并不依赖B,但B确实存在于A的进程空间中。
在depends工具中直接打开一个exe,就可以看到情况1的依赖,2和3的依赖要按F7。