COM-DLL без регистрации?
Моя программа использует Skype4COM.dll (оболочка для Skype API).
Я использую Delphi 2010 - есть ли способ убедиться, что моя программа ВСЕГДА использует Skype4COM.dll, с которой я ее отправлю? Дело в том, что существуют разные версии Skype4COM, и если я зарегистрирую свою версию на ком-то другом, их приложение может больше не работать.
Обычно я использую RegSvr32 для регистрации библиотеки DLL в системе People, но я слышал, что можно сделать ее свободной от регистрации (в C#), поэтому мой вопрос: можем ли мы сделать это и в Delphi?
Спасибо!
3 ответа
Прежде чем вы коснетесь регистрации бесплатный com, убедитесь, что ваше приложение работает, когда dll зарегистрирована. Как только вы довольны этим. Пришло время попробовать и заставить его работать бесплатно. Первый шаг - отменить регистрацию вашей dll. Если вы попытаетесь запустить вашу программу сейчас, вы должны получить ClassId не найден.
Первым шагом является создание файла манифеста для вашего приложения. Файл манифеста - это XML-файл, который, помимо прочего, может устанавливать зависимости для вашего приложения. Возможно, вы этого не знаете, но, поскольку в Delphi 2007 включены темы, у вашего приложения всегда был манифест. Вот это из Delphi 2010:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="CodeGear RAD Studio"
version="14.0.3615.26342"
processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Теперь я не уверен, что вы можете добавить к этому, и вы можете иметь только один файл манифеста для приложения, я просто заменяю его полностью. Поскольку я хочу, чтобы темы были включены, я начинаю с этого файла и добавляю свою зависимость. В вашем случае вам нужно добавить зависимость для skype4com.dll Вот что мне нужно добавить:
<assemblyIdentity
name="Skype4COM.X"
version="1.0.36.0"
type="win32"
processorArchitecture="x86">
</assemblyIdentity>
Заметьте, я фактически добавляю зависимость к сборке Skye4COM.X, а не к самой dll. Не путайте 2, хотя DLL может быть сборкой, сборка не обязательно 1 DLL. Это станет ясно, когда мы настроим манифест сборки /
Ваш файл манифеста теперь становится:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="CodeGear RAD Studio"
version="14.0.3615.26342"
processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity
name="Skype4COM.X"
version="1.0.36.0"
type="win32"
processorArchitecture="x86">
</assemblyIdentity>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Сохраните этот файл с тем же именем, что и ваш исполняемый файл, но с суффиксом.manifest. Например, SkypeClient.exe.manifest
Следующим шагом является встраивание этого манифеста в ваше приложение. Вам нужно будет создать файл ресурсов (файл rc) со следующим текстом:
#define RT_MANIFEST 24
#define APP_MANIFEST 1
APP_MANIFEST RT_MANIFEST SkypeClient.exe.manifest
Добавьте этот файл в ваше приложение и соберите. Если у вас все еще включены темы, вы получите предупреждение о дублировании ресурса, просто удалите {$R *.res} из вашего файла dpr. Вы также должны увидеть это в файле проекта:
{$R 'SkypeClient.manifest.res' 'SkypeClient.manifest.rc'}
Если вы попытаетесь запустить приложение сейчас, вы получите следующее сообщение об ошибке:
Невозможно создать процесс: приложение не удалось запустить, поскольку его параллельная конфигурация неверна. Пожалуйста, смотрите журнал событий приложения или используйте инструмент командной строки sxstrace.exe для более подробной информации.
Теперь нам нужно добавить манифест для сборки (Skype4COM.X). Создайте файл с именем Skype4COM.X.manifest. Нам нужно описать сборку в файле манифеста:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="Skype4COM.X"
version="1.0.36.0"
type="win32"
processorArchitecture="x86">
</assemblyIdentity>
<file name="Skype4COM.dll">
<typelib
tlbid="{03282B5D-B38F-469D-849A-09B0A7F4881B}"
version="1.0"
helpdir=""
flags="hasdiskimage"/>
</file>
</assembly>
Теперь поместите приложение dll и манифест сборки в одну папку и запустите!
Если вы получаете больше ошибок, вам нужно использовать SxSTrace для отладки. Это доступно в Vista и далее. Сначала запустите трассировку:
SxSTrace trace -logfile:sxsTrace.etl
запустите вашу программу и нажмите Enter на трассировке, чтобы завершить ее. Теперь разбираем трассировку:
SxSTrace parse -logfile:SxSTrace.etl -outfile:SxStrace.txt
Вы должны иметь полный журнал всего процесса в SxSTrace.txt
См. Статью MSDN While & Muller 2005 года " Активация COM-компонентов без регистрации: пошаговое руководство". Это демонстрируется с C++, C# и VB, но ничего из этого не важно. Часть кода - в шагах с 1 по 3 - это то же самое, что вы делаете в любом COM-приложении. Пошаговое руководство объясняет:
Активация компонентов COM без регистрации не требует специального кода на сервере или на клиенте. Все, что требуется, это соответствующая пара файлов манифеста.
Создайте файл манифеста для вашей COM DLL, а затем создайте файл манифеста для вашего приложения, которое ссылается на него.
Вот практический пример использования SSH Chilkat (ChilkatSsh.dll
) Библиотека ActiveX.
ChilkatSsh.dll
экспорт 6 классов:
- Chilkat.Ssh
- Chilkat.Key
- Chilkat.Sftp
- Chilkat.SftpFile
- Chilkat.SftpDir
- Chilkat.SshTunnel
Для которого я создал Chilkat.SSH.manifest
сборочный манифест:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" />
<file name="ChilkatSsh.dll">
<!-- CLASS_ChilkatSsh -->
<comClass
progid="Chilkat.Ssh"
clsid="{72A1C13F-1C23-4C52-97F0-BCA902148720}"
threadingModel="Apartment">
</comClass>
<!-- CLASS_ChilkatSshKey -->
<comClass
progid="Chilkat.SshKey"
clsid="{73111D94-E28A-4587-B687-60E23CD989A8}"
threadingModel="Apartment">
</comClass>
<!-- CLASS_ChilkatSFtp -->
<comClass
progid="Chilkat.SFtp"
clsid="{64A17FBB-89E2-403F-8E06-B7CE412FB0E6}"
threadingModel="Apartment">
</comClass>
<!-- CLASS_ChilkatSFtpFile -->
<comClass
progid="Chilkat.SFtpFile"
clsid="{B2208BCC-AB0F-4722-A908-2F54269D21C2}"
threadingModel="Apartment">
</comClass>
<!-- CLASS_ChilkatSFtpDir -->
<comClass
progid="Chilkat.SFtpDir"
clsid="{39B10683-ED49-47A3-A4A5-AB1F52D1C2CC}"
threadingModel="Apartment">
</comClass>
<!-- CLASS_ChilkatSshTunnel -->
<comClass
progid="Chilkat.SshTunnel"
clsid="{4D881197-5686-45BF-B9D9-9EC432F4BB75}"
threadingModel="Apartment">
</comClass>
</file>
</assembly>
Теперь вам просто нужно сослаться на сборку в манифесте вашего приложения. Например, точно так же, как вы можете объявить зависимость от Common Controls version 6
:
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>
Вы объявляете зависимость от Chilkat SSH
:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" />
</dependentAssembly>
</dependency>