2009-10-03 16 views
2

Mon scénario est le suivant: mon application dépend d'une certaine DLL (je l'utilise lib pendant le linkage). Cependant, lorsque mon application est exécutée, je veux charger explicitement cette DLL en utilisant LoadLibrary. Cependant, par défaut, lorsque le code atteint une portée où cette DLL est nécessaire, l'environnement la recherche automatiquement, puis la charge. Je veux désactiver ce comportement, et pour tout ce qui m'importe, si l'application a atteint un point où elle veut exécuter du code qui appartient à cette DLL, je préfère qu'elle se bloque au lieu de la charger automatiquement (ainsi la DLL sera chargée seulement parce que j'ai explicitement appelé LoadLibrary).
En attendant, j'utilise la capacité de charge de retard (ainsi le déclencheur de charge se produira seulement quand la DLL doit réellement être chargée). Cependant, je préférerais que l'application plante juste si la DLL n'était pas encore chargée.Désactiver le chargement automatique des DLL en C++

Peut-être quelqu'un est-il familier avec un moyen d'y parvenir?

+0

Pouvez-vous nous expliquer pourquoi vous voulez faire cela? – JaredPar

Répondre

6

Si vous souhaitez utiliser LoadLibrary, ne liez pas l'application à la bibliothèque d'importation. Le format PE ne prend pas en charge les éléments externes non résolus. Vous pouvez donc utiliser les en-têtes et dllimport ou LoadLibrary, GetProcAddress et des pointeurs vers des fonctions.

4

(je l'utilise est lib pendant la liaison)

Si vous voulez le charger manuellement à l'aide LoadLibrary et GetProcAddress alors vous ne devriez pas passer son fichier *.lib à votre linker.

2

Vous pouvez empêcher le chargement automatique en ne liant pas la bibliothèque d'importation de la DLL (le fichier .lib). Vous pouvez ensuite utiliser LoadLibrary pour charger manuellement la DLL lorsque vous en avez besoin.

J'ai posté une entrée de blog à propos de faire ce genre de chose here.

0

La fonctionnalité de chargement différé ne chargera pas une DLL jusqu'à son premier appel de fonction, pas portée. Si vous avez des initialiseurs globaux qui appellent cette DLL, alors c'est peut-être la raison pour laquelle vous pensez que sa portée est basée. Mon entreprise utilise la technique d'appel LoadLibrary avant utilisation sans problèmes. Je suggère de creuser plus loin dans votre problème.

+0

Je suis conscient de cela, c'est pourquoi j'ai utilisé delayLoad en premier lieu .. –

1

Vous pouvez accrocher le mécanisme de temporisation. Définissez __pfnDliNotifyHook2 sur une fonction que vous fournissez et, dans ce crochet, terminez simplement votre application.