Регистрация-бесплатный COM / DLL?

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

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

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

спасибо!

3 ответов


прежде чем даже коснуться регистрации free 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>

Сохраните этот файл с тем же именем, что и исполняемый файл, но с a .суффикс манифеста. Например SkypeClient.исполняемый.манифест

следующим шагом является внедрение этого манифеста в ваше приложение. Вам нужно будет создать файл ресурсов (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.инструмент для ехе дополнительные подробности.

теперь нам нужно добавить манифест для сборки (Skype4COM.Икс.) Создайте файл под названием Skype4COM.X. манифест. Нам нужно описать сборку в файле манифеста :

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


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

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

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


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

The ChilkatSsh.dll экспорт 6 классов:

  • Chilkat.Ssh
  • Chilkat.Ключ
  • 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>