Это в Delphi XE7. У меня была существующая библиотека типов (для Dynami c Virtual Channels - на стороне клиента), и мне нужно было добавить метод в интерфейс, чтобы приложение на стороне клиента могло взаимодействовать с dll для отправки сообщений по виртуальному каналу. Я создал новый интерфейс, получил новый GUI для него, изменил файл .idl (Windows SDK предоставляет файл tsvirtualchannels.idl в Windows SDK ).
Я использовал midl для создания библиотеки типов .tlb из .idl, а затем запустил tlibimp ( Утилита Embarcadero ) для создания delphi -tlb.pas
Мой Delphi класс реализует новый метод. Но новый интерфейс не был зарегистрирован с Windows, и все попытки использовать Embarcadero tregsvr (, работающий в командной строке с повышенными привилегиями ) для регистрации библиотеки завершились неудачно с сообщением Ошибка доступа к реестру OLE
Я попытался зарегистрировать новый интерфейс вручную. Я создал свой интерфейс, аналогичный IWTSListener, и просмотрел реестр, нашел этот ключ, экспортировал его, затем изменил имя интерфейса на мое и GUID на новый GUID, а затем повторно импортировал его. Всего было четыре экземпляра.
Когда запускается клиентская dll, она запускает внепроцессный сервер и передает ему Agile Ссылку (интерфейса клиентской библиотеки DLL. Ссылка agile показывает, как приложение MTA может поговорить с STA). Однако, когда я запрашиваю интерфейс, чтобы получить мой новый интерфейс, я получаю интерфейс не поддерживается .
Я более или менее отказался от tregsvr. Он не содержит подробностей об ошибках. Есть ли что-нибудь еще, что мне нужно сделать для регистрации нового интерфейса?
Мне пришло в голову, что есть одна или две вещи, которые могут помешать этому курсу действий:
- Я не менял основной интерфейс dll с IWTSPlugin на IWTSPlugin2. Будет ли Windows (то есть msts c) использовать IWTSPLUGIN2 для виртуальных каналов? Добавление к нему нового интерфейса без его изменения - смертный грех ( Я знаю - mea culpa ) .