加载DLL文件时,是否也调用DLL文件的入口点?

时间:2019-02-07 06:53:48

标签: windows dll

我举个例子。

如果通过某种方式执行了DLL文件(称为A),则我认为'A'会在系统根目录中加载某些DLL文件。

这些DLL文件之一称为“ B”,其入口点类似于DllMain函数。

所以如果我运行'A',也会调用'B'的入口点吗?

如果调用它,我可以控制DllMain的参数吗?

感谢您对此问题的关注。

祝你有美好的一天:)

2 个答案:

答案 0 :(得分:0)

我回答了我自己的问题:)

示例

DllMain函数:

DllMain(...) {
    MessageBoxA(NULL, "in DLL1 function DllMain()", "test", 0);
    hello()
    ...
}

hello函数(不导出函数):

hello() {
    MessageBoxA(NULL, "in DLL1 function hello()", "test", 0);
}

导出功能(导出功能):

exported() {
    MessageBoxA(NULL, "in DLL1 function exported()", "test", 0);
}

,然后按以下顺序弹出消息框:

DllMain()-> hello()-> exported()-> DllMain()-> hello()

但是我不知道为什么DllMain函数最终被调用。

答案 1 :(得分:0)

这取决于您如何加载DLL。

  • 如果它是通过导入表链接的,则将在需要依赖项时(实际上是在加载依赖项之前)对其进行加载并执行DllMain

  • 如果通过LoadLibrary加载,则将执行其DllMain

  • 如果通过LoadLibraryEx加载并且使用了LOAD_LIBRARY_AS_DATAFILELOAD_LIBRARY_AS_DATAFILE_EXCLUSIVELOAD_LIBRARY_AS_IMAGE_RESOURCE标志中的任何一个,则将DllMain跳过。 / p>

更多详细信息可以在the LoadLibraryEx documentation中找到。