Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> parent interface for dll's, IDispatch vs. IUnknown 
V
    Опции темы
Cashey
  Дата 30.6.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Развиваем тему создания и использования COM объекта smile
Итак, в теме про создание dll была создана и зарегистрированна в системе динамическая библиотека, реализующия функции модуля Registry. Однако оказалось, что созданный объект имеет по умолчанию интерфейс типа IUnknown. Создать такой объект в среде VFoxPro не удается по причине того, что такой тип интерфейса в нем не поддерживается. Но поддерживается IDispatch. 
Попытался просто заменить тип на закладке Attributes интефейса класса, но в этом случае весь проект престает компилится. Ругается не прилично, Undeclared identifier: 'GetTypeInfoCount' ...'GetTypeInfo', ...'GetDsOfNames', ...'Invoke'

Проект состоит из 3-х не базовых файлов:

Unit1
Код

unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, ActiveX, Classes, ComObj, reg_TLB, StdVcl, Registry;

type
  TTreg = class(TTypedComObject, ITreg)
  protected
    function ReadString(const Name: WideString): WideString; stdcall;
    procedure WriteString(const Name, Value: WideString); stdcall;
    function CreateKey(const Key: WideString): WordBool; stdcall;
    function OpenKey(const Key: WideString; CanCreate: WordBool): HResult;
      stdcall;
    procedure CloseKey; stdcall;
  end;

implementation

uses ComServ;

var
  R : TRegistry;

function TTreg.ReadString(const Name: WideString): WideString;
begin
  result := R.ReadString(Name);
end;

procedure TTreg.WriteString(const Name, Value: WideString);
begin
R.WriteString(Name, Value);
end;

function TTreg.CreateKey(const Key: WideString): WordBool;
begin
  result := R.CreateKey(Key);
end;

function TTreg.OpenKey(const Key: WideString;
  CanCreate: WordBool): WordBool;
begin
  result :=  R.OpenKey(Key, CanCreate) ;
end;

procedure TTreg.CloseKey;
begin
    R.CloseKey
end;


initialization
  TTypedComObjectFactory.Create(ComServer, TTreg, Class_Treg,
    ciMultiInstance, tmApartment);
end.


reg_TLB
Код

unit reg_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}

interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
const
  regMajorVersion = 1;
  regMinorVersion = 0;

  LIBID_reg: TGUID = '{39C29BA8-6627-4613-8E78-26EB999A4FE2}';

  IID_ITreg: TGUID = '{D53AC200-9C37-492F-885B-F9CD33230CFA}';
  CLASS_Treg: TGUID = '{900FCC2B-2921-4B90-B871-C3BD4C28EAF6}';
type

 ITreg = interface;

 Treg = ITreg;


  ITreg = interface(IUnknown)
    ['{D53AC200-9C37-492F-885B-F9CD33230CFA}']
    function ReadString(const Name: WideString): WideString; stdcall;
    function CreateKey(const Key: WideString): WordBool; stdcall;
    function OpenKey(const Key: WideString; CanCreate: WordBool): HResult; stdcall;
    procedure WriteString(const Name: WideString; const Value: WideString); stdcall;
    procedure CloseKey; stdcall;
  end;

  CoTreg = class
    class function Create: ITreg;
    class function CreateRemote(const MachineName: string): ITreg;
  end;

implementation

uses ComObj;

class function CoTreg.Create: ITreg;
begin
  Result := CreateComObject(CLASS_Treg) as ITreg;
end;

class function CoTreg.CreateRemote(const MachineName: string): ITreg;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_Treg) as ITreg;
end;

end.

комментарии удалены

и собственно модуля библиотеки reg
Код

library Reg;

uses
  ComServ,
  reg_TLB in 'reg_TLB.pas',
  Unit1 in 'Unit1.pas' {Treg: CoClass};

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

{$R *.TLB}

{$R *.RES}

begin
end.



Как видно, на прямую вышеперечисленные типы не объявляются.

Вопрос: как создать COM объект, унаследовав интерфейс от IDispatch?  

Это сообщение отредактировал(а) Cashey - 30.6.2006, 09:58


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
_hunter
Дата 30.6.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 2
Всего: 98





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Cashey
Дата 3.7.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(_hunter @  30.6.2006,  12:09 Найти цитируемый пост)
http://www.realcoding.net/article/view/2876
http://www.unix.org.ua/press/skpress/pc_mag/029719.htm
http://www.unix.org.ua/press/skpress/pc_mag/p963.htm  

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


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Cashey
Дата 7.7.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Ну есть у кого-нибудь готовый пример библиотеки COM сервера, унаследованного от интерфейса IDispatch? 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Damarus
Дата 8.7.2006, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



Я в Delphi не очень разбираюсь, но судя по статье (http://www.realcoding.net/article/view/2876) надо с помощью мастера создавать не СОМ-объект, а Сервер автоматизации. 
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.