COM-DLL без регистрации? - PullRequest
       54

COM-DLL без регистрации?

29 голосов
/ 22 февраля 2011

Моя программа использует Skype4COM.dll (оболочка для Skype API).

Я использую Delphi 2010 - есть ли способ убедиться, что моя программа ВСЕГДА использует Skype4COM.dll, чтоЯ отправлю это с?Дело в том, что существуют разные версии Skype4COM, и если я зарегистрирую свою версию на ком-то другом, их приложение может не работатьчтобы сделать его без регистрации (в C #), поэтому мой вопрос: можем ли мы сделать это и в Delphi?

Спасибо!

Ответы [ 3 ]

45 голосов
/ 22 февраля 2011

Прежде чем вы даже коснетесь регистрации, убедитесь, что ваше приложение работает, когда dll зарегистрирована.Как только вы довольны этим.Пришло время попробовать и заставить его работать бесплатно.Первый шаг - отменить регистрацию вашей dll.Если вы попытаетесь запустить вашу программу сейчас, вы должны получить ClassId not found.

Первый шаг - создать файл манифеста для вашего приложения.Файл манифеста - это 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

14 голосов
/ 22 февраля 2011

См. Статью MSDN While & Muller 2005 года " Активация COM-компонентов без регистрации: пошаговое руководство ."Это демонстрируется с C ++, C # и VB, но ничего из этого не важно.Часть кода - в шагах с 1 по 3 - это то же самое, что вы делаете в любом COM-приложении.Пошаговое руководство объясняет:

Для активации COM-компонентов без регистрации не требуется специального кода на сервере или на клиенте.Все, что требуется, - это совпадающая пара файлов манифеста.

Создайте файл манифеста для вашей COM DLL, а затем создайте файл манифеста для своего приложения, которое ссылается на него.

1 голос
/ 16 октября 2012

Вот практический пример использования библиотеки ActiveX Chilkat (ChilkatSsh.dll).

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