2009-09-07 14 views
6

Jestem w rozpaczliwej potrzebie pomocy, potrzebuję zarządzać zależnościami aplikacji w Visual Studio. Aplikacja łączy się z biblioteką DLL tylko w określonej wersji systemu Windows, powiedzmy Windows 7. i w innych środowiskach, biblioteka DLL nie powinna być ładowana. Jak będę mógł to osiągnąć za pomocą DLL Delay Loading, ponieważ ten temat jest dla mnie całkowicie nowy i nie ma dobrych referencji online w tej konkretnej sprawie.Opóźnienie Ładowanie bibliotek DLL

Pozdrowienia

+1

Pytasz jak działa opóźnienia załadunku, lub w jaki sposób można je stosować? – xtofl

Odpowiedz

8

Twój projekt może określić, że to zależy od dll ale powinny być ładowane w razie potrzeby, poprzez określenie go w/input/bibliotek DLL polu Delay Loaded Linker. To ustawienie może być inne dla różnych konfiguracji kompilacji.

+0

Thx dla człowieka odpowiedzi, ale możesz podać przykład lub fragment kodu, jeśli ma to zastosowanie :) –

+4

To jest punkt ładowania opóźnienia: jest to rzecz konfiguracyjna, a nie kodowa. – xtofl

+0

Sformułowanie wydaje się nieprawidłowe: Kiedy mówisz, że "biblioteka DLL, od której jesteś zależna, powinna być powiązana z obciążeniem opóźnionym", wydaje się, że odnosisz się do utworzenia tej biblioteki DLL z jej składnika .obj. Flaga/DELAY jest faktycznie stosowana do modułu, który wykonuje moduł _importing_, a nie _imported_. Jest to również powód, dla którego możesz wczytać biblioteki DLL systemu Windows 2000, które zostałyby zbudowane bez tej pomocy. – MSalters

1

Zamiast używać opóźnienia ładowania, czy rozważałeś użycie dynamicloading z LoadLibrary i GetProcAddress? Jest to prawdopodobnie łatwiejsze w użyciu.

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

PGNSI pGNSI; 
SYSTEM_INFO si; 

ZeroMemory(&si, sizeof(SYSTEM_INFO)); 

pGNSI = (PGNSI) GetProcAddress(
    GetModuleHandle(TEXT("kernel32.dll")), 
    "GetNativeSystemInfo"); 
if(NULL != pGNSI) 
    pGNSI(&si); 
else GetSystemInfo(&si); 
+9

Jak prostsze jest pisanie kodu, który może być automatycznie generowany przez linker? – xtofl

+2

jest w porządku, jeśli masz tylko jedną funkcję, którą chcesz wywołać ... w przeciwnym razie jest to zły wybór, imo. – Goz

+3

-1 - obsługa opóźnionego ładowania w linkerze ma na celu uniknięcie konieczności radzenia sobie z LoadLibrary() i GetProcAddress()! – Bids

10

MSDN ma dość dobry opis here.

Zasadniczo to, co robisz, to ustawienie odpowiedniej biblioteki DLL w sekcji opóźnienia ładowania. Wtedy nie załaduje tej biblioteki DLL, dopóki nie wykonasz wywołania funkcji, która jest w tej bibliotece DLL.

Z powyższego linku:

Visual C++ Linker obsługuje teraz opóźnione ładowanie DLL. Ten zwalnia Cię z konieczności korzystania z funkcji Windows SDK LoadLibrary i GetProcAddress do implementacji opóźnionego ładowania DLL.

Przed Visual C++ 6.0, jedynym sposobem na załadowanie biblioteki DLL w czasie wykonywania była za pomocą LoadLibrary i GetProcAddress; system operacyjny ładowałby bibliotekę DLL, gdy plik wykonywalny lub biblioteka DLL, która go używała, została załadowana.

Począwszy od Visual C++ 6.0, gdy linkowanie statyczne z biblioteką DLL, linker udostępnia opcje opóźnienia ładowania biblioteki DLL, aż program wywoła funkcję w tej bibliotece DLL.

Aplikacja może opóźnić ładowanie biblioteki DLL za pomocą opcji łącznika /DELAYLOAD (Delay Load Import) z funkcją pomocniczą (domyślna implementacja dostarczona przez Visual C++). Funkcja pomocnika załaduje bibliotekę DLL w czasie wykonywania , wywołując funkcję LoadLibrary i GetProcAddress.

Należy rozważyć opóźnienie ładowania DLL jeżeli:

Twój program może nie wywołać funkcję w DLL.

funkcji w DLL nie może uzyskać wywołana do późnych Twojego programu wykonania.

Opóźnione ładowanie biblioteki DLL można określić podczas kompilacji jako projekt .EXE lub .DLL. Projekt .DLL, który opóźnia ładowanie jednej lub więcej bibliotek DLL, nie powinien sam wywoływać opóźnionego załadowania punktu wejścia w Dllmain.

Powiązane problemy