MSVC DLL加载:是在没有DllMain的情况下直接加载的__declspec(dllexport)函数



我试图在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。

有许多术语或多或少是有联系的:

  • 显式/隐式链接-这有点不合适,因为.dll要么被链接(通过.exe或另一个.dll(。更好的术语是显式/隐式加载,因为加载.dll的方式:

    1. 显式ly-从其客户端代码按需(使用LoadLibraryLoadLibraryEx或其他(较低级别(机制(
    2. 隐式ly-默认情况下(由Win在进程启动时自动(检查下一个项目符号((。这些.dll.exe链接(或另一个.dll通过.exe(递归(链接(
    3. [MS.Docs]:延迟加载dll的链接器支持-满足中间的上述2个选项,利用每个选项的优势(意味着.dll仍将自动加载(因此它仍然是隐式加载(,但仅在需要时(调用其函数之一(,而不是进程启动(
  • [MS.Docs]:DllMain入口点当.dll加载到进程中时执行的函数,无论加载方法(如上(

  • function_sendNumber-由.dll导出,原因是__declspec(dllexport((并且名称保持简单(即使代码编译为C++(,原因是extern"C">(

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

    • 它由.dll导出
    • external 关键字([Emarcadero.DocWiki]:过程和函数(Delphi((
    • 函数实际上是从Delphi代码中调用的

    检查了这3项后,Delphi通过.exe链接.dll(在引擎盖下(,因此您有隐式加载(值得一提的是@HeartWare建议也将函数标记为Delphi延迟,以便从延迟加载中受益(

最新更新