一个模块可以通过多种方式依赖于另一个模块:
隐式依赖(也称为加载时间依赖或有时不正确地称为静态依赖):
模块A在编译/链接时与模块B的LIB文件隐式链接,并且模块A的源代码实际上调用一个或多个函数模块B是模块A的加载时间依赖性。无论模块A在运行时是否实际调用模块B,模块B都将加载到内存中。模块B将列在模块A的导入表中。
延迟加载相关性:
模块A在编译/链接时与模块B的LIB文件链接了延迟加载,并且模块A的源代码实际上调用了模块B中的一个或多个函数。模块B是动态依赖项,并且只会如果模块A在运行时实际上对模块B进行了调用,则已加载。模块B将列在模块A的延迟负载导入表中。
前向依赖关系:
模块A在编译/链接时与模块B的LIB文件链接,并且模块A的源代码实际上调用了模块B中的一个或多个函数。模块B中调用的函数之一实际上是对模块B的转发函数调用。模块C。模块B和模块C都是模块A的依赖项,但是只有模块B会在模块A的导入表中列出。
显式依赖性(也称为动态或运行时依赖性):
在编译/链接时,模块A未与模块B链接。在运行时,模块A通过LoadLibrary类型的函数动态加载模块B。模块B成为模块A的运行时依赖项,但不会在任何模块A的表中列出。这种类型的依赖关系在OCX,COM对象和Visual Basic应用程序中很常见。
系统挂钩依赖性(也称为注入依赖性):
当另一个应用程序在进程中挂钩特定事件(例如鼠标事件)时,会发生这种类型的依赖性。当该进程产生该事件时,操作系统可以将模块注入该进程中以处理该事件。注入到进程中的模块实际上并不依赖于任何其他模块,但确实位于该进程的地址空间中。