2016-06-12 18 views
0

stellte ich Verzögerung Laden in meiner Plugin gestern bis:Wie kann ich verhindern, dass eine verzögerungsgeladene DLL einen Systemfehler "fehlt von Ihrem Computer" auslöst?

#ifdef _WIN32 
#pragma warning (disable : 4100) /* Disable Unreferenced parameter warning */ 
#include <windows.h> 
#include <delayimp.h> 
#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]

Und ich bin die DLLs auf Plugin Last Initialisierung:

#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]

Hier ist mein Build-Protokoll nach dem Hinzufügen der Pragma-Anweisungen:

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 ========== 

die sofort geändert:

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 ========== 

Nach einem weiteren Aufbau mit ohne Änderungen am Code.

Aber stattdessen es immer noch versuchen, die DLL zu laden, bevor das Plugin selbst initialisiert, mir eine geben: benutzte ich die Tutorials here und here für die verzögerte Laden

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. 

. Ich habe auch die Fragen here, here, here und here gelesen, aber keine haben mein Problem gelöst.

+0

In Visual Studio, "Projekteigenschaften -> Linker -> Eingabe -> Delay Loaded Dll" sollten Sie "libcurl.dll; iconv.dll" etc. setzen –

+0

@BarmakShemirani Ich habe das bereits getan, wie Sie sehen können Zeile 10 meines ersten Codebeispiels oder Zeile 21 oder mein tatsächlicher Code. – NobleUplift

+0

Sie müssen Projekteigenschaften ändern, es ist keine Codezeile. Ich kann das nirgendwo in deiner Frage oder den Links sehen. Sie haben zu viele Links gesetzt, ich bin mir nicht sicher, worauf Sie sich beziehen. Das Ändern der Projekteigenschaften ist alles was Sie brauchen. –

Antwort

1

Vergessen Sie nicht, die "*.dll" Erweiterung einzuschließen. In Linker-Option müssen Sie Folgendes angeben:

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

Wenn Sie #pragma comment(lib, "libcurl") verwenden dann müssen Sie es nicht ein zweites Mal in Linker-Option angeben.

SetDllDirectory(L"./plugins/ts3websitepreview/"); sollte ausreichen. Sie brauchen nicht __HrLoadAllImportsForDll.

Wenn Sie die DLLs DLL_PROCESS_ATTACH vorzeitig aufrufen möchten, verwenden Sie stattdessen LoadLibrary.

+0

Danke. Ich werde es versuchen, wenn ich nach Hause komme. – NobleUplift

+0

Nun, das war wahrscheinlich mein schlimmster Fall, die Dokumentation jemals falsch zu lesen. Ich erhalte 'LINK: Schwerwiegender Fehler LNK1194: kann 'libxml2.dll' aufgrund des Imports des Datensymbols nicht verzögern '__imp__xmlFree'; Link ohne/DELAYLOAD: libxml2.dll', aber das könnte eine andere Frage sein. Lustig ist, wenn ich es auskommentiere, kompiliert meine DLL und funktioniert gut ... es wird nur Speicherleck. – NobleUplift