![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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