【问题标题】:When loading a DLL File, is the entry point of the DLL File also called?加载 DLL 文件时,是否也调用了 DLL 文件的入口点?
【发布时间】:2019-07-01 05:51:09
【问题描述】:

我以一个问题为例。

如果一个 DLL 文件(称为 A)以某种方式执行,我假设“A”在系统根目录中加载了一些 DLL 文件。

其中一个名为“B”的 DLL 文件具有类似于 DllMain 函数的入口点。

所以如果我运行“A”,是否也会调用“B”的入口点?

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

感谢您对此问题的关注。

祝你有美好的一天:)

【问题讨论】:

    标签: windows dll


    【解决方案1】:

    我回答我自己的问题:)

    示例

    DllMain函数:

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

    hello函数(未导出函数):

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

    导出函数(exported function):

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

    消息框按以下顺序弹出:

    DllMain() -> hello() -> 导出() -> DllMain() -> hello()

    但我不知道为什么最后会调用 DllMain 函数。

    【讨论】:

    • DllMain 获得“附加”和“分离”通知——这些参数让您能够区分。
    【解决方案2】:

    这取决于您如何加载 DLL。

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

    • 如果通过LoadLibrary加载,其DllMain会被执行。

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

    更多详情请见the LoadLibraryEx documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多