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>
Другие вопросы по тегам