我试图用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。
答案 0 :(得分:3)
许多术语或多或少地相互关联:
显式/隐式链接-这是不正确的,因为 .dll 是通过 .exe 链接的或其他 .dll )。由于 .dll 的加载方式,更好的说法是 Explicit /隐式加载:
[MS.Docs]: DllMain entry point将 .dll 加载到进程中时正在执行的功能,不管加载方法(如上所述)< / p>
function_sendNumber -由于 __ declspec(dllexport) (和由于 extern“ C” ,该名称保持简单(即使代码被编译为 C ++ )
可以从 Delphi 调用函数的事实是因为:
选中这3个项目后, Delphi 进行了(幕后)将 .dll 与 .exe 链接的工作,并且因此,您有隐式加载(值得一提的是@HeartWare的建议,也将功能标记为来自 Delphi 的 已延迟 ,以受益于延迟加载)