2009-09-07 11 views
6

Ho un disperato bisogno di aiuto, ho bisogno di gestire una dipendenza dell'applicazione in Visual Studio. L'applicazione si collega a una DLL solo su una versione specifica di Windows, diciamo Windows 7. e su altri ambienti, la DLL non dovrebbe essere caricata. Come sarò in grado di farlo utilizzando il caricamento ritardato della DLL poiché questo argomento è completamente nuovo per me e non ci sono buoni riferimenti online per questo particolare argomento.Ritardo caricamento DLL

saluti

+1

Stai chiedendo come funziona il caricamento ritardato o come puoi applicarlo? – xtofl

risposta

8

il progetto può specificare che una dll dipende da dovrebbe essere caricato, ma in caso di necessità, specificando nella/Input/campo DLL Delay Loaded Linker. Questa impostazione può essere diversa per diverse configurazioni di build.

+0

Thx per il reply man ma puoi dare un esempio o uno snippet di codice se applicabile :) –

+4

Questo è il punto di caricamento in ritardo: è una cosa di configurazione, non una cosa di codice. – xtofl

+0

La dicitura sembra errata: quando si dice "La DLL che si sta utilizzando dovrebbe essere collegata alla capacità di caricamento ritardato", sembra che si stia riferendo alla creazione di quella DLL dal suo componente .obj. Il flag/DELAY viene effettivamente applicato al modulo che esegue _importing_, non il modulo _imported_. Questo è anche il motivo per cui è possibile ritardare il caricamento di DLL di Windows 2000, che sarebbero state create senza questo supporto. – MSalters

1

Invece di utilizzare il caricamento in ritardo, hai considerato l'utilizzo di dynamicloading con LoadLibrary e GetProcAddress? È probabile che sia più semplice da usare.

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

Com'è più semplice scrivere codice che può essere generato automaticamente dal linker? – xtofl

+2

va bene se si ha solo 1 funzione che si desidera chiamare ... altrimenti è una scelta pessima, imo. – Goz

+3

-1 - il supporto per il caricamento ritardato nel linker è specificamente finalizzato a evitare di dover caricare LoadLibrary() e GetProcAddress()! – Bids

10

MSDN ha una descrizione abbastanza buona here.

Fondamentalmente ciò che si sta facendo è impostare la DLL in questione in modo che si trovi nella sezione di caricamento del ritardo. Quindi non caricherà quella DLL finché non si effettua una chiamata a una funzione che si trova in quella DLL.

dal link qui sopra:

Visual C++ linker ora supporta il caricamento ritardato di DLL. Questo allevia la necessità di utilizzare le funzioni di Windows SDK LoadLibrary e GetProcAddress per implementare il caricamento ritardato della DLL.

Prima di Visual C++ 6.0, l'unico modo per caricare una DLL in fase di esecuzione era di utilizzando LoadLibrary e GetProcAddress; il sistema operativo caricava la DLL quando veniva caricato l'eseguibile o la DLL che lo utilizzava.

A partire da Visual C++ 6.0, quando il collegamento staticamente a una DLL, il linker fornisce opzioni per ritardare caricare la DLL finché il programma chiama una funzione in quella DLL.

Un'applicazione può ritardare il caricamento di una DLL utilizzando l'opzione di collegamento /DELAYLOAD (Delay Load Import) con una funzione di supporto (implementazione predefinita fornita da Visual C++). La funzione di supporto caricherà la DLL durante l'esecuzione del tempo chiamando LoadLibrary e GetProcAddress.

Si dovrebbe considerare ritardo caricamento di una DLL se:

Il vostro programma non può chiamare una funzione nella DLL.

Una funzione nella DLL potrebbe non essere richiamata fino a quando non è in esecuzione l'esecuzione del programma.

Il caricamento ritardato di una DLL può essere specificato durante la creazione di un progetto .EXE o .DLL. Un progetto .DLL che ritarda il caricamento di di una o più DLL non deve chiamare esso stesso un punto di ingresso con ritardo di caricamento in Dllmain.

Problemi correlati