Основы COM. Рудалев В.Г - 26 стр.

UptoLike

26
// Загружаем файл - эмблему Delphi
Pic.LoadFromFile(FileName);
// Меняем изображение
with Pic.Bitmap.Canvas do begin
Font.name:='Times New Roman';
Font.Style:=[fsItalic,fsBold];
Font.Size:=20;
Font.Color:=clRed;
TextOut(40,110,'E');
TextOut(105,70,'D');
TextOut(98,1,'B');
end;
// Преобразуем для отправки клиенту
GetOlePicture(Pic, Destination);
except
MessageDlg ('Ошибка преобразования!', mtError,[mbOK],
0);
end;
// Освобождаем переменную
Pic.Free;
end;
initialization
TTypedComObjectFactory.Create(ComServer, TChangeImage,
Class_ChangeImage,
ciMultiInstance, tmApartment);
end.
После компиляции проекта мы получим файл InProcServer.dll, содержащий код
сервера . Далее необходимо зарегистрировать сервер в реестре, используя про -
цедуру RegSvr32
RegSvr32 InProcServer.dll,
или нажав кнопку Register Type Library в редакторе библиотеки типов , или вы-
брав пункт меню Run Register ActiveX Server.
Разумеется, логичнее передавать серверу не имя файла, а само изображение.
Но, к сожалению, у преобразований, осуществляемых функциями Delphi 6
GetOlePicture и SetOlePicture, имеются недокументированные осо -
бенности , в результате чего к преобразованному ими TPicture невозможно
применить методы класса TBitMap для редактирования, изменения формата и
сохранения изображения.
Отметим также трудности передачи изображений с использованием внешнего
сервера , так как для типа данных IPictureDisp маршаллинг надо програм-
мировать вручную . Для внутреннего сервера маршаллинг не требуется.
                                         26
    // Загружаем файл - эмблему Delphi
    Pic.LoadFromFile(FileName);
    // Меняем изображение
    with Pic.Bitmap.Canvas do begin
       Font.name:='Times New Roman';
       Font.Style:=[fsItalic,fsBold];
       Font.Size:=20;
       Font.Color:=clRed;
       TextOut(40,110,'E');
       TextOut(105,70,'D');
       TextOut(98,1,'B');
    end;
    // Преобразуем для отправки клиенту
     GetOlePicture(Pic, Destination);
  except
     MessageDlg ('Ошибка преобразования!', mtError,[mbOK],
                                                      0);
  end;
  // Освобождаем переменную
  Pic.Free;
end;

initialization
  TTypedComObjectFactory.Create(ComServer,                       TChangeImage,
Class_ChangeImage,
     ciMultiInstance, tmApartment);
end.

Послекомпи ляци и проекта мы получи м фай л InProcServer.dll, сод ерж ащ и й код
серв ера. Д алее необход и мо з ареги стри ров ать серверв реестре, и спольз уя про-
цед уру RegSvr32
RegSvr32 InProcServer.dll,
и ли наж ав кнопку Register Type Library в ред актореби бли отеки ти пов , и ли в ы -
брав пунктменю Run –Register ActiveX Server.
Раз умеется, логи чнее перед ав ать серв еру не и мя фай ла, а само и з ображ ени е.
Н о, к сож алени ю , у преобраз ов ани й , осущ еств ляемы х функци ями Delphi 6
GetOlePicture и SetOlePicture, и мею тся нед окументи ров анны е осо-
бенности , в рез ультате чего кпреобраз ов анному и ми TPicture нев оз мож но
при мени ть метод ы класса TBitMap д ля ред акти ров ани я, и з менени я формата и
сохранени яи з ображ ени я.
О тмети м такж е труд ности перед ачи и з ображ ени й с и спольз ов ани ем в неш него
серв ера, таккакд ля ти па д анны х IPictureDisp марш алли нг над о програм-
ми ров ать в ручную . Д ляв нутреннего сервера марш алли нг нетребуется.