MSVC DLL加载:__declspec(dllexport)函数是否直接加载而没有DllMain

时间:2020-07-16 06:09:49

标签: delphi dll dllexport dllmain

我试图用VS C ++编写具有以下导出功能的DLL项目:

extern "C"  __declspec(dllexport) int function_sendNumber(unsigned num);

我注意到VS项目附带了包含DllMain入口函数的文件dllmain.cpp。 但是,我评论了DllMain函数并使用Delphi exe应用程序来 调用导出的函数,如下函数指针:

function  function_sendNumber(n : Integer): Integer; cdecl;
external 'DLLproject.dll';

Delphi应用程序成功调用了DLL导出函数。 我以为这种方法是DLL显式链接。 所以我想清楚地理解是显式加载还是隐式加载。 如果是这样,如何在没有DllMain的情况下加载导出的函数。 我找不到对LoadLibrary的任何调用来加载DLL。

1 个答案:

答案 0 :(得分:3)

许多术语或多或少地相互关联:

  • 显式/隐式链接-这是不正确的,因为 .dll 是通过 .exe 链接的或其他 .dll )。由于 .dll 的加载方式,更好的说法是 Explicit /隐式加载

    1. 显式 ly-根据其客户端代码的要求(使用 LoadLibrary LoadLibraryEx 或其他(较低级别)机制) >
    2. 隐式 ly-默认情况下(自动,通过 Win 在进程启动时自动 (检查下一个项目符号) ) strong> )。这些 .dll .exe 链接(或由 .exe .dll >)
    3. [MS.Docs]: Linker Support for Delay-Loaded DLLs-在中间满足上述2个选项,并从每个选项中受益(这意味着 .dll 仍将自动加载(因此它仍然是 Implicit Loading ),但仅在需要时(称为功能之一),而不是进程启动时)
  • [MS.Docs]: DllMain entry point .dll 加载到进程中时正在执行的功能,不管加载方法(如上所述)< / p>

  • function_sendNumber -由于 __ declspec(dllexport) (和由于 extern“ C” ,该名称保持简单(即使代码被编译为 C ++

  • 可以从 Delphi 调用函数的事实是因为:

    选中这3个项目后, Delphi 进行了(幕后)将 .dll .exe 链接的工作,并且因此,您有隐式加载(值得一提的是@HeartWare的建议,也将功能标记为来自 Delphi 已延迟 ,以受益于延迟加载