Moja pierwsza myśl to, że jeśli statycznie łączysz dll, to nie jest to wtyczka. Po prostu umieść bibliotekę DLL w folderze EXE i skończ z nią. To jest konfiguracja wdrażania obsługiwana przez okna dla statycznie załadowanych bibliotek DLL.
Powiedziawszy, istnieją sposoby osiągnięcia tego, co chcesz. Są one jednak w większości głupie lub skomplikowane bez ważnego powodu: dostępne są następujące opcje:
- Nie statycznie łącz. Użyj funkcji LoadLibrary ("plugins/Plugin.dll") & GetProcAddress, aby uzyskać dostęp do zawartości wtyczki.
- Dodaj "ścieżkę do folderu wtyczek" do zmiennej środowiskowej PATH systemów.
- Użyj mechanizmu opóźnienia obciążenia, aby opóźnić dostęp do funkcji wtyczek, ustaw custom helper function, który może załadować bibliotekę dll za pomocą dostarczonej ścieżki.
- Zmień folder wtyczek w zespół (tworząc plik .manifest zawierający listę wtgin.dll). Dodaj "wtyczki" jako zależny zespół do swojej aplikacji. Teraz będzie wyglądać w folderze wtyczek.
- Podziel swoją aplikację na kod pośredniczący i dynamicznie ładowaną część. W wywoływaniu exe wywołaj SetDllDirectory, aby wskazał folder wtyczki, a następnie wywołaj LoadLibrary przekazując pełną ścieżkę do "appstub.dll".
Aby włączyć folder, z jednym lub więcej bibliotek DLL w produkt „montaż”, wystarczy dodać plik do folderu z folderów name.manifest.
Więc plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
Jest to bardzo dobry pomysł, aby upewnić się, że folder i nazwa DLL jest inna jakby nazwa dll jest montaż okien nazwa zaczyna patrząc na jego wbudowania plik manifestu dla informacji o złożeniu.
Zakładając, że używasz programu Visual Studio 7 lub nowszego, do pliku .c/.cpp lub. Dodano następującą dyrektywę.Plik h w projekcie będą następnie dokonać próby aplikacji ładowania bibliotek DLL z zespołu, a nie tylko lokalnego katalogu:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")
Dzięki - skorzystałem z metody GetProcAddress, ponieważ nie mogłem zrozumieć, jak musi wyglądać manifest, aby działało podejście "fałszywy montaż". Na szczęście działa to dobrze w całej architekturze. – Oliver
Nie potrzebujesz 'SetDllDirectory' do ładowania opóźnienia; istnieje hook '__pfnDliNotifyHook2', dzięki czemu możesz wywołać' LoadLibrary (". \\ plugins \\ PluginX.dll") 'bezpośrednio. Pomysł '% PATH%' jest trochę kruchy, ponieważ jest on raczej niski na liście lokalizacji do sprawdzenia. – MSalters
dzięki. Nigdy osobiście nie używałem opóźnienia ładowania, więc założyłem, że SetDllDirectory będzie sposobem na dostrojenie. –