Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Singleton Com Server [D7, Win95/98, WinME, Win2k, WinXP]


kblc ©   (2005-09-05 18:32:00) 

Уважаемые мастера, почему не работает этот код?

type
 TMySingletonObject = class(TComObject, IMySingletonObject)
 protected
 end;

 TMySingletonObjectFactory = class (TComObjectFactory)
 public
   function CreateComObject(const Controller: IUnknown): TComObject; override;
 end;

implementation

uses ComServ;

var
 cntSyngletonObject : TComObject;

function TMySingletonObjectFactory.CreateComObject(const Controller: IUnknown): TComObject;
begin
 if cntSyngletonObject = nil then
   Result := inherited CreateComObject (Controller)
 else
   Result := cntSyngletonObject;
end;

initialization
 TMySingletonObjectFactory.Create(ComServer, TMySingletonObject, Class_MySingletonObject,
   ciMultiInstance, tmApartment);
end.


НЕ то что бы КОД не работает, дело в другом - при повторном вызов е CreateComObject создаётся новый объект. ;( почему?


Erik1   (2005-09-07 16:21:00) [1]

Ты лучше приведи пример работы с фабрикой, а то неочень понятно в чем проблема.


kblc   (2005-09-06 14:40:00) [2]

АУ!!! Люди, помогите ответить на вопрос: kblc ©   (06.09.05 12:22) [14]


kblc   (2005-09-06 12:58:00) [3]

Просто я не использую OLE атоматизацию


isasa   (2005-09-06 12:51:00) [4]

TMySingletonObject = class(TComObject, IMySingletonObject)
->
TMySingletonObject = class(TAutoObject, IMySingletonObject)

?


kblc   (2005-09-06 12:22:00) [5]

А вот вопрос:
 Если я попытаюсь создать совершенно другой СОМ-сервер этой же фабрикой, то он создастся или всё же выдаст мне предыдушее значение (т.е. другого СОМ-сервера)?


Digitman   (2005-09-06 11:10:00) [6]

ну тогда отладчик в руки - и вперед


kblc   (2005-09-06 10:52:00) [7]

Переписал:

function TMySingletonObjectFactory.CreateComObject(const Controller: IUnknown): TComObject;
begin
if cntSyngletonObject = nil then
begin
  Result := inherited CreateComObject (Controller);
  cntSyngletonObject:=Result;
end else
  Result := cntSyngletonObject;
end;

Результет тот же... :(


Digitman   (2005-09-06 10:00:00) [8]


> Почему?


а почему, по твоему, cntSyngletonObject может быть не-nil ?

где в твоем коде присвоение не-nil-значения этой переменной ?


kblc   (2005-09-06 09:58:00) [9]

> Digitman ©   (06.09.05 09:51) [9]
Почему? Не подскажешь как от этого избавится?


Digitman   (2005-09-06 09:51:00) [10]


> if cntSyngletonObject = nil then


условие cntSyngletonObject = nil у тебя всегда истинно


kblc   (2005-09-06 09:36:00) [11]

IMySingletonObject = interface
 function Status: WideString; stdcall;
end;

TIMySingletonObject = class(TComObject, IMySingletonObject)
   procedure Initialize; override;
 private
   prStatus: WideString;
 protected
   function Status: WideString; virtual; stdcall;
end;

procedure TIMySingletonObject.Initialize;
begin
 inherited;
 prStatus:=TimeToStr(Time);
end;

function TIMySingletonObject.Status: WideString;
begin
 Result:=prStatus;
end;


Использую так:

 c1:=CreateComObject(Class_Singleton) as IMySingletonObject;
 Sleep(1000); // на всякий случай, что бы точно проверить их время создания
 c2:=CreateComObject(Class_Singleton) as IMySingletonObject;
 if string(c1.Status) = string(c2.Status) then
 Urrrrraaaa else
 FackinPeaceOfShit;


Digitman   (2005-09-06 09:07:00) [12]

покажи код контроллера ..


kblc   (2005-09-06 09:03:00) [13]

Неужели никто не знает?


kblc   (2005-09-05 20:02:00) [14]

Люди подскажите что я делаю не так?


kblc   (2005-09-05 18:50:00) [15]

Все вызовы происходят из одного процесса


kblc   (2005-09-05 18:48:00) [16]

ciSingleInstance && tmSingle ничего не меняют!


Digitman   (2005-09-05 18:48:00) [17]


> при повторном вызов е CreateComObject


в контексте одного и того же процесса ? или из разных процессов ?


Digitman   (2005-09-05 18:40:00) [18]


> почему?


потому что ты сам сказал своей фабрике - ciMultiInstance


Наверх

Титульная страница Поиск, карта сайта Написать письмо