Question

Mon projet est un plug-in (DLL sous Windows) qui est chargé par un hôte exécutable non pas sous mon contrôle.Ma DLL souhaite charger quelques autres libs.Je le fais avec privé assemblées;il y a une grande réponse à comment une Application Win32 plugin charger ses DLL dans son propre répertoire pour savoir comment faire cela.Mais si j'ajoute /delayload dependentlib.dll sur la DLL principale de la ligne de liaison pour éviter le chargement de l'assemblée jusqu'à ce qu'il en a besoin (je dois le faire pour diverses raisons), Windows n'est plus mes recherches privées assemblées -- semble qu'il ignore le manifeste j'ai compilé.Au lieu de cela, il semble pour le retard-DLL chargée habituelles dans le chemin de recherche.(J'utilise sysinternals procmon pour vérifier ce point.)

Est-ce un bug connu, ou est-il un autre moyen de chargement de délai une assemblée?Je préfère ne pas aller dans le LoadLibrary + GetProcAddress route où je sais que tous les symboles I se soucier de la charge lib.

Était-ce utile?

La solution

Votre problème ici est que, quand le premier appel à un retard chargé de la fonction est faite, les applications par défaut d'activation de contexte est le contexte actuel.

Ce que vous devez faire est de créer un contexte d'activation: CreateActCtx pointant vers votre propre manifeste (hinstance+id de ressource est possible je pense).

Ensuite, l'emballage de tous, ou au moins le premier, appel à la dll avec ActivateActCtx (et le correspondant de désactiver la fonction) pour assurer le bon assemblées sont recherchés.

En théorie, vous pourriez juste intégrer le code pour activer le contexte approprié dans le delayload helper fonction.

Autres conseils

Ce comportement est voulu par la conception, malheureusement.Essentiellement, lorsque vous spécifiez /DELAYLOAD, vous êtes juste en demandant à l'éditeur de liens pour insérer la fonction LoadLibrary et GetProcAddress appels pour vous.En conséquence, le comportement lors de retarder le chargement d'une DLL qui est la même que pour le chargement des DLL de façon dynamique avec la fonction LoadLibrary.

MSDN décrit certaines des conséquences.Sur le côté positif, vous pouvez remplacer le comportement par défaut.Je vous recommande de rédiger votre propre délai de charge fonction d'assistance.

FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd, FARPROC * ppfnIATEntry)
{
    //...
}

L'éditeur de liens insérer des appels à cette fonction chaque fois qu'il doit résoudre un point d'entrée dans un délai chargement des DLL.Votre version peut mettre en œuvre une recherche personnalisée pour vos assemblées. Voici plus d'informations sur la fonction d'assistance sur le site MSDN.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top