2010-12-09 3 views
6

Nous avons une DLL (un serveur COM) qui se compilera correctement en 32 bits et 64 bits, mais la DLL utilise les mêmes CLSID et AppID pour la version 32 bits et la version 64 bits. Est-ce OK ou est-ce que cela doit changer? Je demande cela parce que, apparemment, sur une machine 64 bits, nous ne pouvons pas enregistrer la version 32 bits et la version 64 bits ensemble. Il serait bon que les applications client 32 bits utilisent automatiquement la DLL 32 bits et que les applications clientes 64 bits utilisent automatiquement la DLL 64 bits. Sur une note connexe, nous avons le code source et le fichier de projet Visual Studio 2005 pour une application cliente ... comment compiler une version 32 bits et 64 bits de la même application? Il est une application C#, et il inclut une référence à notre DLL serveur COM comme ceci:Comment puis-je installer les versions 32 bits et 64 bits d'une DLL COM et "auto-select"?

<ItemGroup> <COMReference Include="ComServer">

<Guid>{C1FADEA6-68FD-4F43-9FC2-0BC451FA5D53}</Guid>

<VersionMajor>830</VersionMajor> <VersionMinor>0</VersionMinor>

<Lcid>0</Lcid> <WrapperTool>tlbimp</WrapperTool> <Isolated>False</Isolated>

</COMReference> </ItemGroup>

S'il s'avère que nous avons besoin d'un CLSID séparé pour 64 bits, comment faisons-nous cette référence "uniquement pour la configuration 32 bits" dans Visual Studio? Ou devons-nous avoir des projets séparés avec le même code source: un qui fait référence à la DLL 32 bits, et l'autre qui fait référence à la DLL 64 bits?

Répondre

13

Les deux versions peuvent (et devraient même) utiliser les mêmes GUID pour tout.

Sur une machine 32 bits, vous ne pouvez pas enregistrer ou utiliser la DLL 64 bits, il n'y a donc aucun problème. La DLL 64 bits n'entre tout simplement pas dans l'image.

Sur une machine 64 bits, la DLL 64 bits est enregistrée dans HKLM/Software/Classes/CLSID (etc.) et la DLL 32 bits est enregistrée dans HKLM/Software/Wow6432Node/Classes/CLSID. (Je me demande où vous avez reçu l'avis que vous ne pouvez pas enregistrer la DLL 32 bits sur une machine 64 bits ...) Un client 32 bits fonctionnant sur la machine 64 bits va chercher à l'endroit normal dans le registre , mais le système d'exploitation le redirigera silencieusement vers la clé Wow6432Node à la place.

+2

Oublié de dire ... sur la machine 64 bits, il y a une version 32 bits de regsvr32.dll dans \ Windows \ SysWow64 \ pour enregistrer des DLL 32 bits dans la zone Wow6432Node. (Vous devrez juste vous habituer au modèle de nommage complètement contre-intuitif.) Nous avons eu un problème avec notre installateur - sur une machine 64 bits, il n'utiliserait pas le regsvr32 32 bits.DLL, mais nous devions installer une DLL 32 bits. Nous avons donc fini par écrire notre propre version et l'exécuter explicitement. –

+0

Au moins sur Win7, regsvr32.exe est assez intelligent pour appeler l'autre version de lui-même automatiquement si vous l'exécutez sur le type opposé de DLL. (Cela vaut pour les DLL 32 bits et 64 bits et les versions de regsvr32.exe.) –

+0

@Leo: Merci pour le conseil. J'avais lu à ce sujet mais j'ai trouvé que cela ne fonctionnait pas pour Vista, alors j'ai pensé que c'était juste quelque chose qui était tombé entre les mailles du filet. Je n'ai commencé à tester sur Win7 qu'après avoir terminé l'installation. –

7

Ceci est traité dans Windows avec une fonctionnalité appelée 'Registry redirection' Sur la version 64 bits de Windows, un programme 32 bits obtient une vue différente du registre. Tout accès à l'alias HKCR ou à la racine HKLM \ Software est redirigé vers le type de clé utilisé par un serveur COM. Un programme 32 bits voit réellement les valeurs de clé stockées dans HKLM \ Software \ Wow6432Node. Vous pouvez le voir avec Regedit.exe

Ceci est normalement pris en charge par un installateur, un projet VS Setup a la propriété TargetPlatform par exemple. Si vous souhaitez rendre le serveur COM disponible en mode 32 bits et 64 bits, vous devez utiliser deux programmes d'installation. Ou un programme d'installation 64 bits qui écrit les deux ensembles de clés. Avoir un serveur COM qui peut gérer les deux est très inhabituel dans les temps anciens. Mais pas inouï quand vous avez implémenté dans .NET par exemple.

Questions connexes