Регистрация бесплатных сообщений Com и dll

Я пытаюсь настроить регистрацию бесплатного COM, но имею небольшую проблему в том, что другой COM-объект может быть клиентом.

App.exe ----- > DLL сервера COM/клиент (зарегистрированный или нет) -------- > COM-сервер DLL (НЕ зарегистрирован)

Мои вопросы: возможно ли создать манифест для второй dll (COM-сервер/клиентская dll)? Я не контролирую исполняемый файл, но если это так, это работает, если я создаю манифест клиента для исполняемого файла и манифест сервера для DLL сервера COM.

это файл манифеста для средней 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="COMCliSer.dll" 
                    version="1.0.0.0" 
  />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity 
                     name="COMSer.dll" 
                    version="1.0.0.0"                    
      />
    </dependentAssembly>
  </dependency>
</assembly>

В ходе дальнейшего расследования я могу заставить все это работать, пока средняя dll также является бесплатной регистрацией, а exe имеет манифест приложения. Как только я зарегистрирую среднюю dll и отменим манифест приложения (у меня нет контроля над тем, что exe будет использовать мою dll), все это перестает работать.

Если exe не имеет манифеста, тогда манифест dll не принимается во внимание. Я могу это доказать, настроив все на работу. Затем допустим ошибку в манифесте сборки. Появится обычное сообщение:

Невозможно создать процесс: это приложение не запускалось, потому что неправильная конфигурация приложения. Повторная установка приложения может устранить эту проблему.

Если я затем отброшу манифест приложения, приложение загрузится (хотя CoCreateInstance завершится неудачно, потому что зависимости не принимаются во внимание)

Ответ 1

Просто добавьте зависимость сборки к манифесту dll сервера/клиента, который указывает на DLL COM-сервера.

Помните, что манифеста сборки отличается от манифестов приложения: манифест сборки описывает сборку: дает ей имя и перечисляет свои DLL. Явлением приложения является встроенный ресурс RT_MANIFEST, который описывает текущие зависимости модулей.

Итак, в конечном итоге вы бы получили:

  • app.exe с внешним (app.exe.manifest) или встроенным RT_MANIFEST, описывающим зависимость от сборки, называемой "acme.clientserver"
  • acme.clientserver.manifest, описывающий сборку, и перечисление "clisrv.dll" в качестве бесплатной учетной записи.
  • clisrv.dll с внешним (clisrv.dll.2.manifest) или встроенным RT_MANIFEST, описывающим зависимость от сборки, называемой "acme.server"
  • acme.server.manifest, описывающий сборку, перечисляя serv.dll как бесплатную учетную запись регистрации.
  • serv.dll - который может или не может, в свою очередь, иметь список манифеста еще более зависимых сборок.

Технически можно вызвать сборку по имени dll и объединить как сборку, так и DLL-манифест вместе - загрузчик win32 поддерживает это, но некоторые параметры, которые действительны в манифесте приложений, недействительны в манифесте сборок, что может привести к сбою в результате сборки. Это также очень сложно подписать цифровую подпись.


WRT exe должен иметь манифест: Обычно манифест exe устанавливает контекст активации по умолчанию процессов. Я не уверен на 100%, как работают окна, когда exe не имеет манифеста, но я уверен, что манифесты в dll будут обрабатываться.

Это означает, что проблема сводится к отсутствию поддержки изоляции в CoCreateInstance - по какой-то причине - по умолчанию - CoCreateInstance только просматривает контекст активации по умолчанию для записей reg free com.

Способ переопределения заключается в том, чтобы вручную создать собственный контекст активации, используя API-интерфейс активации

Основным методом было бы вызвать:

  • CreateActCtx - создать контекст активации из манифеста dlls.
  • ActivateActCtx - для активации контекста
  • CoCreateInstance - теперь будет искать текущий контекст активации для записей reg free com.
  • DeactivateActCtx - для восстановления контекста активации по умолчанию.

Вы можете добавить /D ISOLATION_AWARE_ENABLED, чтобы обернуть большинство вызовов Windows, которые выполняются контекстами активации, по какой-то причине CoCreateInstance не завернута:/