Как установить как 32-разрядную, так и 64-разрядную версии COM DLL и «автоматический выбор»? - PullRequest
7 голосов
/ 10 декабря 2010

У нас есть DLL (COM-сервер), которая прекрасно скомпилируется в 32-разрядной и 64-разрядной версиях, но DLL использует одинаковые CLSID и AppID для 32-разрядной и 64-разрядной версии.Это нормально или это нужно изменить?

Я спрашиваю это, потому что, очевидно, на 64-битной машине мы не можем зарегистрировать 32-битную версию и 64-битную версию вместе.Было бы неплохо, если бы 32-битные клиентские приложения могли автоматически использовать 32-битную DLL, а 64-битные клиентские приложения могли автоматически использовать 64-битную DLL.

В соответствующей заметке у нас есть исходный коди файл проекта Visual Studio 2005 для клиентского приложения ... как скомпилировать 32-разрядную и 64-разрядную версию одного и того же приложения?Это приложение на C #, которое включает в себя ссылку на нашу библиотеку DLL COM-сервера, например:

<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>

Если выясняется, что нам нужен отдельный CLSID для 64-битной системы, как мы можем сделать эту ссылку "только для32-битная конфигурация "в Visual Studio?Или у нас должны быть отдельные проекты с одним и тем же исходным кодом: один ссылается на 32-битную DLL, а другой - на 64-битную DLL?

Ответы [ 2 ]

14 голосов
/ 10 декабря 2010

Обе версии могут (и действительно должны) использовать одни и те же GUID для всего.

На 32-битной машине вы не можете зарегистрироваться или использовать 64-битную DLL, поэтому там нет проблем. 64-битная DLL просто не входит в изображение.

На 64-битной машине 64-битная DLL регистрируется в HKLM / Software / Classes / CLSID (и т. Д.), А 32-битная DLL регистрируется в HKLM / Software / Wow6432Node / Classes / CLSID. (Интересно, откуда у вас совет, что вы не можете зарегистрировать 32-битную DLL на 64-битной машине ...) 32-битный клиент, работающий на 64-битной машине, будет выглядеть в обычном месте в реестре , но операционная система будет молча перенаправлять его на ключ Wow6432Node.

8 голосов
/ 10 декабря 2010

Эта проблема рассматривается в Windows с помощью функции Перенаправление реестра 'В 64-разрядной версии Windows 32-разрядная программа получает другое представление о реестре.Любой доступ к псевдониму HKCR или корню HKLM \ Software перенаправляется в зависимости от типа ключей, используемых COM-сервером.32-битная программа фактически видит значения ключей, хранящиеся в HKLM \ Software \ Wow6432Node.Это можно увидеть с помощью Regedit.exe

Обычно об этом заботится установщик, например, в проекте установки VS есть свойство TargetPlatform.Если вы хотите сделать COM-сервер доступным как в 32-битном, так и в 64-битном режиме, вам следует использовать два установщика.Или 64-битный установщик, который записывает оба набора ключей.Наличие COM-сервера, который может обрабатывать оба типа, очень необычно в старину.Но не случайно, когда вы реализовали в .NET, например.

...