Deux programmes Delphi doivent charger foo.dll, qui contient du code qui injecte un certificat client-auth dans une requête SOAP. foo.dll réside dans c: \ fooapp \ foo.dll et est normalement chargé par c: \ fooapp \ foo.exe. Cela fonctionne bien. L'autre programme a besoin de la même fonctionnalité, mais il réside dans c: \ program files \ unwantedstepchild \ sadapp.exe. Les deux aps chargent la DLL avec ce code:Delphi LoadLibrary A défaut de trouver un autre répertoire DLL - de bonnes options?
FOOLib := LoadLibrary('foo.dll');
...
If FOOLib <> 0 then
begin
FOOProc := GetProcAddress(FOOLib , 'xInjectCert');
FOOProc(myHttpRequest, Data, CertName);
end;
Il fonctionne très bien pour foo.exe, comme dll est là. sadapp.exe ne parvient pas à charger la bibliothèque, FOOLib a donc la valeur 0 et le reste n'est jamais appelé. Le programme sadapp.exe échoue donc silencieusement à injecter le cert, et lorsque nous testons contre la production, le cert est manquant, la connexion échoue. Évidemment, nous devrions avoir entièrement qualifié le chemin vers la DLL. Sans entrer dans beaucoup de détails, certains aspects du test ont masqué ce problème jusqu'à récemment, et il est maintenant trop tard pour corriger le code, car cela nécessiterait un test de régression complet, et il n'y a pas de temps pour cela.
Puisque nous nous sommes peints dans un coin, j'ai besoin de savoir s'il y a des options que j'ai oubliées. Bien que nous ne puissions pas changer le code (pour cette version), nous pouvons modifier le programme d'installation. J'ai trouvé que placer c: \ fooapp dans le chemin fonctionne. Tout comme l'ajout d'une seconde copie de foo.dll directement dans c: \ program files \ unwantedstepchild. c: \ fooapp \ foo.exe sera toujours en cours d'exécution pendant que sadapp.exe est en cours d'exécution, donc j'espérais que Windows le trouverait de cette façon, mais apparemment pas. Existe-t-il un moyen de dire à Windows que je veux vraiment cette même DLL? Peut-être un manifeste ou quelque chose? C'est le genre de "balle magique" que je cherche. Je sais que je peux:
- Modifier le chemin de Windows, probablement dans le programme d'installation. C'est moche.
- Ajoutez une deuxième copie de la DLL, directement dans le dossier unwantedstepchild. Aussi moche
- Retardez le projet pendant que nous codons et testons un correctif approprié. Inacceptable.
- Autre?
Merci pour toute orientation, en particulier avec "Autre". Je comprends que ce problème n'est pas nécessairement spécifique à Delphi. Merci!
1 et 2 sont acceptables pour moi. Vous avez dit que c'est seulement pour cette version. Donc, regardez-le comme une solution temporaire. Vous pouvez le faire correctement avec la prochaine version. À mon avis, vous n'avez pas besoin de perdre votre temps avec ça. 2 est probablement mieux parce que vous pouvez le désinstaller sans problèmes. – Runner
Vous considérez que vos options 1 et 2 sont «moche». au contraire, ce sont des techniques standard et pas moche du tout. D'un autre côté, vous dites "Evidemment, nous devrions avoir complètement qualifié le chemin vers la DLL". ** Absolument pas! ** Ce que vous proposez ici vraiment *** serait UGLY ***. Tout le monde n'aime pas polluer leur structure C: \ folder avec votre dossier 'fooapp'. Pourtant, en codant dur un chemin, vous empêchez quelqu'un de faire autre chose. _Les utilisateurs devraient être capables d'installer n'importe quel emplacement ** ou n'importe quel lecteur ** et avoir toujours une application fonctionnelle. –
Vous avez une 4ème option: installez DLL dans un dossier partagé sur le chemin Windows. Le "dossier système" de Windows est candidat (mais vous pouvez utiliser et configurer votre propre dossier si vous le souhaitez). Le dossier partagé a une petite mise en garde: cela signifie que toutes les applications utilisent la même version de la DLL. Et peut conduire à un problème connu sous le nom "DLL Hell" (lecture suggérée). Ceci est généralement résolu en plaçant une version spécifique de la DLL dans le dossier de l'application (c'est-à-dire votre option 2). Donc, naturellement, je suggère que l'option 2 est probablement la meilleure solution provisoire; puisque c'est quelque chose qui pourrait arriver de toute façon. –