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

29

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

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

Обычно я использую RegSvr32 для регистрации DLL в системе людей, но я слышал, что его можно сделать без регистрации (на С#), поэтому мой вопрос: можно ли это сделать и в Delphi?

Спасибо!

Теги:
dll
skype

3 ответа

45
Лучший ответ

Прежде чем вы даже коснитесь бесплатной регистрации регистрации, убедитесь, что ваше приложение работает, когда 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

  • 0
    Вау, спасибо за это подробное руководство! +1! Попробую это, как только я доберусь домой до своей IDE. Можно ли будет встраивать все внешние файлы в мой exe, как ресурс? Или они не смогут извлечь, пока приложение не понадобится?
  • 0
    Что вы подразумеваете под всеми внешними файлами?
Показать ещё 9 комментариев
14

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

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

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

  • 0
    создайте частный файл манифеста сборки (текстовый файл) для компонента SideBySide.dll и назовите его SideBySide.X.manifest. - Зачем добавлять «.X»? Кроме того, не нужно ли мне что-то делать в Delphi для использования файлов .manifest? Я не делал этого раньше.
  • 0
    «В тех случаях, когда это невозможно, пожалуйста, будьте осторожны, чтобы дать вашей сборке (и, следовательно, вашему манифесту сборки) имя, которое отличается от имени файла COM DLL. Так, в приведенном выше случае COM DLL называется SideBySide, но сборка называется SideBySide.X . Если вас интересует причина этого ограничения, это объясняется в разделе « Устранение неполадок ». (В частности, пункты 5–7.)
Показать ещё 1 комментарий
1

Здесь приведен практический пример при использовании Chilkat SSH (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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню