如何阻止延迟加载的DLL抛出“从计算机中丢失”系统错误?

我昨天在插件中设置了延迟加载:

#ifdef _WIN32 #pragma warning (disable : 4100) /* Disable Unreferenced parameter warning */ #include  #include  #endif ... // Configuration Properties / Linker / Input / Additional Dependencies: ./lib/libcurl.lib;./lib/libxml2.lib;./lib/iconv.lib;./lib/zlib1.lib;%(AdditionalDependencies) // Configuration Properties / Linker / Input /Delay Loaded Dlls: libcurl;libxml2;iconv;zlib1;%(DelayLoadDLLs) #include "curl.h" #include "HTMLparser.h" #include "xpath.h" #ifdef _WIN32 #pragma comment(lib, "libcurl") #pragma comment(lib, "iconv") #pragma comment(lib, "libxml2") #pragma comment(lib, "zlib1") #endif 

[ 1 ]

我正在初始化插件加载的DLL:

 #ifdef _WIN32 SetDllDirectory(L"./plugins/ts3websitepreview/"); if (FAILED(__HrLoadAllImportsForDll("libcurl.dll"))) { ts3Functions.logMessage("Could not load curl.", LogLevel_ERROR, "Plugin", 0); return 1; } if (FAILED(__HrLoadAllImportsForDll("libxml2.dll"))) { ts3Functions.logMessage("Could not load libxml.", LogLevel_ERROR, "Plugin", 0); return 1; } if (FAILED(__HrLoadAllImportsForDll("zlib1.dll"))) { ts3Functions.logMessage("Could not load zlib1.", LogLevel_ERROR, "Plugin", 0); return 1; } if (FAILED(__HrLoadAllImportsForDll("iconv.dll"))) { ts3Functions.logMessage("Could not load iconv.", LogLevel_ERROR, "Plugin", 0); return 1; } #endif 

[ 2 ]

添加pragma语句后,这是我的构建日志:

 1>------ Build started: Project: ts3websitepreview, Configuration: Debug Win32 ------ 1>Build started 2016-06-15 06:35:23 PM. 1>InitializeBuildStatus: 1> Creating "Debug\ts3websitepreview.unsuccessfulbuild" because "AlwaysCreate" was specified. 1>ClCompile: 1> plugin.c 1>ManifestResourceCompile: 1> All outputs are up-to-date. 1>Link: 1> Creating library .\ts3websitepreview.lib and object .\ts3websitepreview.exp 1>LINK : warning LNK4199: /DELAYLOAD:libcurl ignored; no imports found from libcurl 1>LINK : warning LNK4199: /DELAYLOAD:libxml2 ignored; no imports found from libxml2 1>LINK : warning LNK4199: /DELAYLOAD:iconv ignored; no imports found from iconv 1>LINK : warning LNK4199: /DELAYLOAD:zlib1 ignored; no imports found from zlib1 1>Manifest: 1> All outputs are up-to-date. 1>LinkEmbedManifest: 1> All outputs are up-to-date. 1> ts3websitepreview.vcxproj -> .\ts3websitepreview.dll 1>FinalizeBuildStatus: 1> Deleting file "Debug\ts3websitepreview.unsuccessfulbuild". 1> Touching "Debug\ts3websitepreview.lastbuildstate". 1> 1>Build succeeded. 1> 1>Time Elapsed 00:00:01.60 ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 

立即改为:

 1>------ Build started: Project: ts3websitepreview, Configuration: Debug Win32 ------ 1>Build started 2016-06-15 06:39:54 PM. 1>InitializeBuildStatus: 1> Creating "Debug\ts3websitepreview.unsuccessfulbuild" because "AlwaysCreate" was specified. 1>ClCompile: 1> plugin.c 1>ManifestResourceCompile: 1> All outputs are up-to-date. 1>Manifest: 1> All outputs are up-to-date. 1>LinkEmbedManifest: 1> All outputs are up-to-date. 1> ts3websitepreview.vcxproj -> .\ts3websitepreview.dll 1>FinalizeBuildStatus: 1> Deleting file "Debug\ts3websitepreview.unsuccessfulbuild". 1> Touching "Debug\ts3websitepreview.lastbuildstate". 1> 1>Build succeeded. 1> 1>Time Elapsed 00:00:00.71 ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 

经过另一次构建而没有更改代码

但相反,它仍然试图在插件甚至初始化之前加载DLL,给我一个:

 ts3client_win32.exe - System Error The program can't start because libcurl.dll is missing from your computer. Try reinstalling the program to fix this problem. 

我在这里和这里使用教程来延迟加载。 我也在这里 , 这里 , 这里和这里读过这些问题,但没有一个能解决我的问题。

不要忘记包含"*.dll"扩展名。 在链接器选项中,您必须指定以下内容:

libcurl.dll;libxml2.dll;zlib1.dll;iconv.dll;

如果使用#pragma comment(lib, "libcurl")则不必在链接器选项中再次指定它。

SetDllDirectory(L"./plugins/ts3websitepreview/"); 应该足够了。 您不需要__HrLoadAllImportsForDll

如果要提前调用DLL的DLL_PROCESS_ATTACH ,请改用LoadLibrary