Je dois désespéré besoin d'aide, j'ai besoin de gérer une dépendance de l'application dans Visual Studio. L'application est liée à une DLL uniquement sur une version spécifique de Windows, disons Windows 7. et sur d'autres environnements, la DLL ne doit pas être chargée. Comment puis-je être capable de réaliser que l'utilisation de DLL retarder le chargement car ce sujet est totalement nouveau pour moi et qu'il n'y a pas de bonnes références en ligne pour cette affaire particulière. P>
Cordialement P>
3 Réponses :
Votre projet peut spécifier qu'une DLL dépend de ne devrait pas être chargée si nécessaire, en la spécifiant dans le champ Linker / Entrée / Délis Chargé de DLL. Ce paramètre peut être différent pour différentes configurations de construction. P>
THX pour l'homme de réponse, mais pouvez-vous donner un exemple ou un extrait de code si celui-ci s'applique :)
C'est le point de délai de chargement: c'est une chose de configuration, pas une chose de code.
Le libellé semble faux: lorsque vous dites "La DLL selon laquelle vous devriez avoir été liée à la capacité de chargement de retard", vous semblez faire référence à la création de cette DLL de son constituant .OBJ. Le drapeau / délai est effectivement appliqué au module qui fait le importateur i>, pas le module importé i>. C'est aussi la raison pour laquelle vous pouvez retarder la chargement de DLL Windows 2000, qui aurait été construit sans ce support.
@Msalters: Vous avez raison: la première option est que la DLL prend en charge Déchargement i>. Corrigé pour cela, merci.
Au lieu d'utiliser le chargement des délais, avez-vous envisagé d'utiliser dynamique Chargement avec LoadLibrary CODE> et
GETPROCADDRESS CODE>? Ceci est susceptible d'être plus simple à utiliser.
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);
Comment est-il plus simple d'écrire du code pouvant être automatiquement généré par la liaison?
C'est bien si vous n'avez que 1 fonction que vous souhaitez appeler ... sinon c'est un mauvais choix simple, imo.
-1 - La prise en charge de la charge de retard dans la liaison est spécifiquement destinée à vous empêcher de devoir traiter Charger () et GetProcAddress ()!
Dans le cas de cette question, (nous supposons), il sait que la DLL sera disponible sur Windows 7 afin qu'il puisse détecter la version du système d'exploitation avant d'appeler un appel de fonction à la DLL retardée. Cependant, il est parfois le cas que vous ne pouvez pas savoir si une DLL est disponible sur un système ou sur quelle version (et donc quelles fonctions exportées) sont disponibles. Dans ces cas, l'utilisation d'une liaison dynamique de temps d'exécution est la solution bien fastidieuse appropriée. Si vous n'avez pas de manière à détecter la présence de la DLL et que vous avez besoin de fonctions exportées avec une certitude de 100%, le chargement de retarder peut simplement être une crash de retard.
Je seconde Xtofl et des offres. Voici beaucoup plus de travail pour utiliser le chargement de l'exécution.
MSDN a une assez bonne description ici . P >
Fondamentalement, ce que vous faites, c'est la définition de la DLL en question pour être dans la section de charge de retard. Il ne chargera alors pas que la DLL ne puisse apporter un appel à une fonction dans cette DLL. P>
de la liaison ci-dessus: p>
La liaison Visual C ++ prend désormais en charge le chargement différé des DLL. Cette vous soulage la nécessité d'utiliser les fonctions SDK Windows LoadLibrary et GetProcAddress pour mettre en œuvre la DLL retardée de chargement. P>
avant Visual C ++ 6,0, le seul moyen de charger une DLL au moment de l'exécution était de en utilisant LoadLibrary et GetProcAddress; Le système d'exploitation chargerait la DLL lorsque l'exécutable ou la DLL l'utilise a été chargée. P>
Commencer avec Visual C ++ 6.0, lorsqu'il s'agit de manière statique avec une DLL, la Linker fournit des options pour retarder la DLL jusqu'à ce que le programme appelle une fonction dans cette dll. p>
Une application peut retarder la chargement d'une DLL à l'aide du / retard de charge (charge de retard Importer) Option de liaison avec une fonction d'assistance (mise en œuvre par défaut fourni par Visual C ++). La fonction d'assistance chargera la DLL à l'exécution Temps en appelant LoadLibrary et GetProcaddress pour vous. P>
Vous devez prendre en compte le retard de chargement d'une DLL si: p>
Votre programme peut ne pas appeler une fonction dans la DLL. P>
Une fonction dans la DLL peut ne pas être appelée jusqu'à tard dans votre programme Exécution. P>
Le chargement différé d'une DLL peut être spécifié lors de la construction de soit un projet .exe ou .dll. Un projet .dll qui retarde le chargement d'une ou plusieurs dll ne doit pas elle-même appeler un point d'entrée chargé de retard en dllmain. P> blockQuote>
Demandez-vous comment fonctionne le chargement de retard, ou comment vous pouvez l'appliquer?