【发布时间】:2019-07-01 05:51:09
【问题描述】:
我以一个问题为例。
如果一个 DLL 文件(称为 A)以某种方式执行,我假设“A”在系统根目录中加载了一些 DLL 文件。
其中一个名为“B”的 DLL 文件具有类似于 DllMain 函数的入口点。
所以如果我运行“A”,是否也会调用“B”的入口点?
如果被调用,可以控制DllMain的参数吗?
感谢您对此问题的关注。
祝你有美好的一天:)
【问题讨论】:
我以一个问题为例。
如果一个 DLL 文件(称为 A)以某种方式执行,我假设“A”在系统根目录中加载了一些 DLL 文件。
其中一个名为“B”的 DLL 文件具有类似于 DllMain 函数的入口点。
所以如果我运行“A”,是否也会调用“B”的入口点?
如果被调用,可以控制DllMain的参数吗?
感谢您对此问题的关注。
祝你有美好的一天:)
【问题讨论】:
我回答我自己的问题:)
示例
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 获得“附加”和“分离”通知——这些参数让您能够区分。
这取决于您如何加载 DLL。
如果它是通过导入表链接的,它将被加载并在需要它的依赖项时(在实际加载依赖项之前)执行其DllMain。
如果通过LoadLibrary加载,其DllMain会被执行。
如果通过LoadLibraryEx 加载,并且使用LOAD_LIBRARY_AS_DATAFILE、LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 或LOAD_LIBRARY_AS_IMAGE_RESOURCE 标志中的任何一个,则将跳过DllMain。
【讨论】: