9
votes

Comment puis-je appeler une DLL 32 bits du code 64 bits?

J'ai quelques dlls 32 bits qui n'ont pas correspondre des DLL de 64 bits. Comment puis-je invoquer ces DLL à partir d'une application 64 bits écrite dans Delphi Xe2?


3 commentaires

Non, blogs.msdn.com/b/oldnewthing/ Archive / 2008/10/20 / 9006720.aspx


Si votre DLL 32 bits n'ayant pas 64 signifie, il est quelque peu supporté, réfléchissez deux fois avant de les utiliser.


Si j'étais vous, je remplacerais simplement ces composants avec des composants prenant en charge 64 bits.


3 Réponses :


15
votes

Non, vous ne pouvez pas directement faire cela. Un processus 64 bits ne peut exécuter que 64 bits de code et un processus de 32 bits ne peut exécuter que 32 bits de code.

le truc est d'utiliser plusieurs processus .... (Remarque Ceci peut être effectué pour le code non visuel, et même pour les éléments d'interface graphique, bien qu'il puisse y avoir des comportements importants mais problématiques pour des éléments visuels .)

La solution la plus courante consiste à envelopper la DLL 32 bits dans un serveur COM de processus, que vous pouvez appeler sur la barrière de 64/32 bits. (Cela va dans les deux sens, vous pouvez créer un serveur COM de processus 64 bits et l'appeler à partir d'une application 32 bits également.)

Oui, il existe d'autres moyens de concevoir cela, mais le plus courant est d'utiliser COM:

  1. Créez un nouveau serveur COM de processus 32 bits qui héberge votre 32 bits DLL et expose les fonctionnalités nécessaires à partir de la DLL 32 bits.
  2. appelez ce serveur COM de votre code 64 bits

    Je devrais ajouter qu'il est également possible de créer le nouveau serveur COM 32 bits en tant que serveur COM de processus, puis configurez COM + pour l'exécuter. COM + va l'exécuter hors du processus et exécutez-vous par magie votre serveur COM de processus 32 bits hors du processus, où vous pouvez l'appeler de 32 et 64 bits de manière transparente, comme si c'était en cours. (Remarque, si le serveur COM est un contrôle de l'interface graphique, sortir du processus peut ne pas fonctionner ou ne pas fonctionner. L'équipe que je travaille avec l'a fait avec succès, mais il y a des complexités - dont certaines ne peuvent être surmontées - liées à l'accrochage parent Windows et contrôles qui ne peuvent pas être effectués à travers la limite de processus.)


1 commentaires

Ce ne devrait pas être exactement compandre. Il peut s'agir de toute technologie de communication interprocession qui convient à vos besoins.



4
votes

Vous pouvez utiliser la même technique exacte utilisée pour appeler 64 bits DLLS à partir de code 32 bits.

Voir http://cc.embarcadero.com/item/27667

"Juste" fait le contraire: exécutez un processus d'arrière-plan 32 bit, la communication de votre processus de 64 bits avec elle à l'aide d'un tampon mappé de mémoire.

Mais cela n'est définitivement pas une tâche facile. Vous devrez réécrire du code ASM. J'ai écrit des article sur la façon dont cela fonctionne.

L'option COM du processus est peut-être la tâche la plus facile à mettre en œuvre. Ou utilisez un IPC plus simple - comme wm_copydata message ou tout autre moyen. Mais vous aurez définitivement besoin d'un autre processus de 32 bits pour créer un lien vers les bibliothèques 32 bits.


2 commentaires

Ce travail appelle-t-il 32 bits du processus de 64 bits? J'ai besoin de l'exact opposé?


La méthode d'Arnaud fonctionne à la fois des façons de 64 à 32 et 32 ​​à 64.



0
votes

J'ai eu le même problème de temps et j'ai trouvé ce lien: DLL 32 bits dans un environnement 64 bits

La DLL 32 bits a été écrite à Delphi, il y a longtemps, et nous avons maintenant eu besoin de l'appeler à partir d'une plate-forme de 64 bits - mais nous n'avons pas de Delphi 64 bits.

Je l'ai fait travailler - bien qu'il semble un peu de krudge, c'était mieux que d'obtenir la DLL réécrit en 64 bits (nous aurions dû acheter une version 64 bits de Delphi ou de partir de gratter quelque chose d'autre).

NB Bien que cela nécessite un piratage, aucune programmation n'est requise - il utilise des composants fournis avec Windows. Fonctionne dans (au moins) Windows 7, Windows 2008.


0 commentaires