Добрый день!
Есть задача написать COM сервер, который бы предоставлял некоторую информацию. В силу обстоятельств требуется, чтобы сервер был out-of-process и мог обслуживать несколько клиентов одновременно.
Интерфейсы нужно организовать в цепочки, так как позволяет это делать Excel: WorkSheet.ActiveCell.Font.SetFont().
Как это сделать в delphi 2010 разобрался. Создал VCL приложение, туда добавил Automation Object.
В дизайнере сделал два интерфейса (IMyAutomationClass и IMySecondAutomation), у интерфейса IMyAutomationClass есть метод, возвращающий указатель на интерфейс IMySecondAutomation:
function TMyAutomationClass.Test2: IMySecondAutomation;
begin
Result := TMySecondAutomation.Create as IMySecondAutomation;
end;
Для обоих интерфейсов в дизайнере .ridl файла присутствуют Co-классы. Библиотека типов сервера зарегистрирована в реестре, как и сам сервер. В секции инициализации создается вторая фабрика для IMySecondAutomation:
TAutoObjectFactory.Create(ComServer, TMyAutomationClass, Class_MyAutomationClass,
ciMultiInstance, tmApartment);
TAutoObjectFactory.Create(ComServer, TMySecondAutomation, CLASS_MySecondAutomation,
ciMultiInstance, tmApartment);
Но, когда я в клиентском приложении выполняю этот код (импортировав до этого туда файл с библиотекой типов сервера):
procedure TForm1.Button1Click(Sender: TObject);
var
Unk,
Unk2: IUnknown;
Int: IMyAutomationClass;
Sec: IMySecondAutomation;
begin
Unk := CreateComObject(CLASS_MyAutomationClass);
Int := Unk as IMyAutomationClass;
Unk2 := Int.Test2; <-- ошибка
Sec := Unk2 as IMySecondAutomation;
end;
То в указанной строчке вылетает AV. Причем, это происходит, даже если TMyAutomationClass.Test2 в сервере не будет создавать объект, вообще ничего не будет делать.
Если же в TMyAutomationClass.Test2 в начале добавить MessageBox() то он тоже не покажется. видимо исключение происходит где-то еще до передачи управления серверу.
Подскажите пожалуйста в чем может быть дело?