Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизDelphi vs. C++ Найти похожие ветки
← →
Vovchik_A © (2004-09-07 14:05) [240]2Суслик © (07.09.04 14:01) [238]
Ну да, все правильно... Все остальные лохи, один ты святее папы римского
← →
Суслик © (2004-09-07 14:08) [241]
> Vovchik_A © (07.09.04 14:05) [240]
> Все остальные лохи, один ты святее папы римского
ну ты и фантазер :))
← →
Ihor Osov'yak © (2004-09-07 14:17) [242]2 Суслик ©
С привода [235] - сори..
Но вот -
> если ты что-то найдешь по интерфейсам (ключевое слово interface), то что я не знаю, очень рад буду услышать:
см. [95]
>Такое часто возникает при подмесе модели интерфесов с моделью объектов. Почти все авторы, кто упоминает интерфейсы в дельфи не рекоммендуют так делать. Но все же приходится.
Можно долго обьяснять, почему это плохо. Но есть подозрение, что человеку это говорилось не единыжды. И в книгах, наверное, рассуждение на эту тему виделось не раз. Но почему-то было проигнорировано. Мало того, лично я придерживаюсь мнения, что если немного включить соображаловку, то можно и самому сообразить (без чтения соотв. выводов в книжках), почему так делать плохо. Поэтому - извините за грубость - LMD.
Зы. Знания, они не для того, чтобы на полку складывать. Или поступать вопреки знаниям. Их на деле применять нужно.
← →
Romkin © (2004-09-07 14:19) [243]Суслик © (07.09.04 14:01) [239] Правильно изложенные утверждения поймут все.
А вот такое:
---
Суслик © (06.09.04 15:29) [95]
> Игорь Шевченко © (06.09.04 15:24) [92]
> Чего именно тебе не хватает, что "не то" ?
Конкретный?
Иногда надо, иногда не надо вызывать _release?
Такое часто возникает при подмесе модели интерфесов с моделью объектов. Почти все авторы, кто упоминает интерфейсы в дельфи не рекоммендуют так делать. Но все же приходится. Особенно, когда интерфейсы начинают использовать в начале проекта, а потом. Думаю за пример сойдет.
Убить вызов релиза просто:
i: ISome;
i := nil; // не так писать, а
pointer(i) := nil; // вот так.
Но это же разврат :(((
---
Romkin © (06.09.04 15:33) [97]
Суслик © (06.09.04 15:29) [95] Ничуть не разврат :)) А не проще дополнительно сделать вызов addref? ;)
---
Суслик © (06.09.04 15:35) [98]
> Romkin © (06.09.04 15:33) [97]
конечно можно.
Но я бы больше был рад отмене на уровне компиляции соответсвующих вызовов (например директивами). ПО моему мнению, сложившемуся на основе анализа cpu, это было бы сделать несложно.
---
Romkin © (06.09.04 15:48) [102]
Суслик © (06.09.04 15:35) [98] Тебе подсчет ссылок совсем отключитиь надо? Так не наследуйся от TInterfacedObject :)
Обрати внимание на TVCLCOMObject...
И, наконец, что мешает прямо где нать объявить свои
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
А? Они подцепятся ;)
---
Суслик © (06.09.04 15:49) [104]
> Romkin © (06.09.04 15:48) [102]
как же тут все невнимательно читают посты других :)))
??? !
Внимательно я читаю. И дал несколько способов, как отключить потсчет ссылок в ответ на [98] - Отключение на уровне компиляции. И "отключение иногда" тоже можно реализовать так. А вот некоторым, которые кричат, что их не понимают, надо бы выражать свои мысли яснее ;))
Не все настолько умные...
← →
Romkin © (2004-09-07 14:25) [244]А насчет Суслик © (07.09.04 13:30) [234]
1. перечисли, плиз, способы внутрипроцессного маршалинга интерфейсов? Кратенько...
2. Что такое специальный маршалинг и как делается?
← →
Суслик © (2004-09-07 14:27) [245]
> Ihor Osov"yak © (07.09.04 14:17) [242]
Рад плодотворной дискуссии:))
> Можно долго обьяснять, почему это плохо. Но есть подозрение,
> что человеку это говорилось не единыжды.
Зачем говорить - я и так знаю, что это в рамках Дельфи плохо.
Проблема, исключительно в 1000 человеко часах, которых нет, чтобы перевести миллионстрочный проект на новые рельсы. Потому и приходится. Если бы было управление временем жизни интерфейса, то и проблем бы не было.
Вот скажи мне - как ты считаешь, почему плохо мешать модель инт. и об.? Конечно, тем, что при приведении вызывается _addref а потом _release? Ну согласись, что если бы я имел возможность этим процессом управлять - ты вряд ли бы нашел другие подтверждения недопустим подмеса моделей. Или нашел бы? Тогда в слуди (если не затруднит).
ЗЫ. Про ЛМД я запомню :)))
> Romkin © (07.09.04 14:19) [243]
> Не все настолько умные...
Да ладно, брось - все хорошо :)))
Ты думаешь я хоть один из этих способов не знаю? Зря.
Ты посмотри на тему - холи вор. По ходу рассуждения я сказал, что если бы бы процесс управления на уровне компилятора (без изврата типа ponter(i) := nil) я был бы рад. Все! Более я ничего сказать не хотел. Если уж сказал, то извините - вор все-таки. :)))
← →
Суслик © (2004-09-07 14:29) [246]
> Romkin © (07.09.04 14:25) [244]
Роман - это к интерфейсам не относится :)))
Интерфейсы это независимая и плодотворная идея ((с) Акуличев), которая и без маршалинга живет.
В данном случае ты спрашиваешь про использование этой независимой и плодотворной идеи, реализованной в компиляторе.
Ну?
← →
Romkin © (2004-09-07 14:33) [247]Суслик © (07.09.04 14:29) [246] Чего-чего? CoMarshalInterface - это реализовано в компиляторе? Ну, в принципе, конечно, через компилятор она прошла...
Хорошо, вопросы попроще:
1. Какими свойствами по соглашениям СОМ должна обладать реализация QueryInterface?
2. Какими способами и для чего можно и нужно использовать IStream?
← →
Суслик © (2004-09-07 14:34) [248]
> Romkin © (07.09.04 14:33) [247]
Роман, одумайся ты про com спрашиваешь!
Я тебе при личной встрече говорил, что ком не знаю! Вообще, писал парочку комов, но это так про книгам.
← →
vuk © (2004-09-07 14:36) [249]to Суслик © (07.09.04 14:27) [245]:
>если бы я имел возможность этим процессом управлять
Как же себе представляется такое управление? Только поподробнее плиз, а не в стиле "хочу, чтоб былО".
← →
Romkin © (2004-09-07 14:40) [250]Суслик © (07.09.04 14:34) [248] Да это я по поводу:
Суслик © (07.09.04 13:30) [234]
> Игорь Шевченко © (07.09.04 12:38) [230]
>да мне в общем-то все равно к кому ты присоединяешься и считаешь ли ты дискуссию бесполезной - это твое дело.
>если ты что-то найдешь по интерфейсам (ключевое слово interface), то что я не знаю, очень рад буду услышать:
>1) учи матчасть
>2) ламери дома
>3) и пр.
>Не найдешь же ведь только :(
Любой интерфейс содержит QueryInterface :)))
Какими свойствами по соглашениям СОМ должна обладать реализация QueryInterface?
В принципе, эти соглашения действуют не только в СОМ ;)
И если ты работаешь с интерфейсами, ЭТО ты обязан знать...
PS. Игорь Шевченко знает :)
← →
Суслик © (2004-09-07 14:42) [251]
> Romkin © (07.09.04 14:40) [250]
> В принципе, эти соглашения действуют не только в СОМ ;)
> И если ты работаешь с интерфейсами, ЭТО ты обязан знать...
Я это знаю :)))
Ты вспомни вопрос -
> 1. Какими свойствами по соглашениям СОМ должна обладать
> реализация QueryInterface?
это разве не про ком?
Извини перевести не успел :)))
Returns a reference to a specified interface if the object supports that interface.
type HResult = Longint;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
Description
QueryInterface checks whether the object that implements this interface supports the interface specified by IID. If so, QueryInterface
increments the reference count.
sets the Obj parameter so that it points to an instance of the specified interface.
returns 0 to indicate success.
If the object does not support the interface, QueryInterface returns a nonzero error code such as E_NoInterface.
← →
Суслик © (2004-09-07 14:45) [252]
> vuk © (07.09.04 14:36) [249]
Например такtype
TObj = class(TInterfacedObject, IInterface)
end;
{$IntfRefConting OFF}
procedure TForm1.Button1Click(Sender: TObject);
var
O: TObj;
I: IInterface;
begin
O := TObj.Create;
I := O;
end;
{$IntfRefConting ON}
В этом случае в конце процедуры в коде не будет
0045235A E8ED3BFBFF call @IntfClear
Я предполагаю, что могут быть сложности в информацией о record, и как следствие с initialize и finlize. Но это легко рарширяемо детализацией информации о типе.
← →
Суслик © (2004-09-07 14:47) [253]
> Суслик © (07.09.04 14:45) [252]
Дополение
и соответственно
0045233B E8243CFBFF call @IntfCopy
будет работать по другому - без _addref.
← →
Акуличев Дмитрий (2004-09-07 14:48) [254]
> Суслик © (07.09.04 14:42) [251]
Двойка.
← →
Суслик © (2004-09-07 14:49) [255]
> Акуличев Дмитрий (07.09.04 14:48) [254]
да ну
← →
Romkin © (2004-09-07 14:49) [256]Суслик © (07.09.04 14:42) [251] Увы, увы. Эт не то. Я спрашивал о свойствах, а не о назначении :))
К сожалению, именно о задекларированных свойствах мало кто знает :( (Особенно из дельфистов, за них ужо в Борланде это сделали...)
Дело в том, что когда ты используешь слово interface в Delphi, ты работаешь так или иначе с СОМ. И здесь надо понимать, что и как там происходит, что ты можешь делать, и чего - нет.
Дело в том, что реализация интерфейсов в Delphi и иерархия VCL для их поддержки - одна из лучших, если не самая лучшая. Бедным сишникам приходится постоянно ставить addref & release, и не дай бог что-то потеряется :))) А ты ноешь, что в Delphi это сделано автоматом?!
← →
Суслик © (2004-09-07 14:51) [257]
> Акуличев Дмитрий (07.09.04 14:48) [254]
> Romkin © (07.09.04 14:40) [250]
Хорошо.
Обращаюсь к вам, господа знающие, объяснить, что я в рамках НЕ СOM технологии должен знать про queryinterface, что я не знаю, т.е. в чем я был не прав, когда привел выдержку из справки?
Буду очень благодарен.
← →
Суслик © (2004-09-07 14:54) [258]
> А ты ноешь, что в Delphi это сделано автоматом?!
> К сожалению, именно о задекларированных свойствах мало кто
> знает :( (Особенно из дельфистов, за них ужо в Борланде
> это сделали...)
Очень рад - значит я в незнающем большинстве. Изучение матчасти не поможет.
А ты ноешь, что в Delphi это сделано автоматом?!
Не ною, а говорю, что это право компилятор мог бы и иначе код строить.
ЗЫ. Про слова о том, что инт-сы неясно всегда ком, я не знал. Каюсь. Где ты это читал - ни в справке, ни в хармоне я этого не видел?
← →
vuk © (2004-09-07 14:56) [259]to Суслик © (07.09.04 14:45) [252]:
>В этом случае в конце процедуры в коде не будет
Пример элементарный и, скорее всего, в реальности будет:
procedure TSomeClass.SomeMethod(Param: ISomeInterface);
begin
...
end;
Или при смешении моделей
procedure TSomeClass.SomeOtherMethod(Param: TSomeObject);
var
intf: ISomeInterface;
begin
if Param.GetInterface(ISomeInterface, intf) then
...
end;
Здесь что делать? Считать или нет? :o)
← →
vuk © (2004-09-07 14:57) [260]to Romkin © (07.09.04 14:49) [256]:
>Дело в том, что когда ты используешь слово interface в Delphi,
>ты работаешь так или иначе с СОМ.
Не согласен. Спорить бум? :o)
← →
Суслик © (2004-09-07 14:57) [261]
> vuk © (07.09.04 14:56) [259]
> Здесь что делать? Считать или нет? :o)
думаю зависит от мифических обсуждаемых директив.
Я согласен - трудностей много будет.
← →
Суслик © (2004-09-07 14:58) [262]
> vuk © (07.09.04 14:57) [260]
Лахааааа!!!! Поддержим меня - я тоже это первый раз слышу!
К тому же я смотрел cpu - я не видел никогда ничего похожее на ком...
← →
Romkin © (2004-09-07 14:59) [263]Суслик © (07.09.04 14:51) [257] ОК. По действующим соглашениям, реализация QueryInterface должна обладать следующими свойствами:
1. Симетричность
2. Транзитивность
3. Рефлексивность
1. Симметричность: Если из интерфейса А вы успешно получили интерфейс В, то, запрос интерфейса А из В также обязан быть успешным
2. Транзитивность: Если был успешный запрос В у А, и также был успешен запрос интерфейса С у В, то запрос С у А также должен быть успешным. if QI(QI(A)->B)->C then QI(A) -> C
3. Рефлексия: QI(A)->A, т.е. запрос из интерфейса его же всегда успешен.
СОМ предусматривает усиление данного свойства: запрос IUnknown всегда возвращает одно и то же значение. Поэтому на вопрос "Реализуются ли все эти интерфейсы одним классом?" очень легко ответить :))
← →
Суслик © (2004-09-07 15:02) [264]
> Romkin © (07.09.04 14:59) [263]
Спасибо, полезно будет знать - может где нить блестнуть знаниями прийдется :)))
← →
Суслик © (2004-09-07 15:04) [265]
> Romkin © (07.09.04 14:59) [263]
Интересно где ты эти правила взял. Полагаю, что все-таки из книг по COM? Правила все логичные, но я их ни в одной книге по интерфейсам в дельфи ни в доке не видел.
Так откуда ты их взял?
← →
vuk © (2004-09-07 15:04) [266]to Суслик © (07.09.04 14:57) [261]:
>думаю зависит от мифических обсуждаемых директив.
>Я согласен - трудностей много будет.
Я не зря говорил, что хочу подробное описание, а не "хочу, чтобы былО". О трудностях надо думать заранее, до того, как громко говорить "хочу".
to Суслик © (07.09.04 14:58) [262]:
>Поддержим меня - я тоже это первый раз слышу!
Ну... Я уже не в первый. :o) Но тут есть одна тонкость - правила работы с интерфейсами в Delphi соответствуют правилам работы с интерфейсами в COM. Поэтому знать их не мешает. Но вот говорить, что используя интерфейсы, используешь COM - в корне не верно.
← →
Ihor Osov'yak © (2004-09-07 15:04) [267]2 Суслик ©
В принцыпе, по существу и коротко - см. [249].
Если более пространно - я подозреваю, что вы ухватились только за одну "фишку" интерфейсной ссылки (aka interface) - способность скрывать часть програмного интерфейса (ака набор методов) обьекта, который хостит (реализовывает) соответсвующий интерфайс. Понятие интерфейса немного шире.
Еще. Это понятие появилось как часть технологии COM. И даже если интерфейсы поддерживаются на уровне синтаксиса делфи, и даже если интерфейсы в делфи можно использовать не только в контексте СOM - то это не значит, что нужно нарушать соглашения относительно интерфейсов и обьектов их хостящих. Хотя бы потому, что ваш код будет совершенно непонетен другому человеку. Немного преувеличив, можно сказать, что ваше желание относительно времени жизни интерфейсов примерно то, когда в с++ оператор + переопределить так, что вместо сложения он будет делать вычетание для целочисельных. Можно, конечно. Но ни один здравормыслящий не будет делать этого.
Здесь бы хотел-бы напомнить слова, услышанные на этом форуме. Авторства, к соджалению, не помню. Суть такова: "Ребята, давайте помнить, что мы программируем под платформу Microcoft Windows. Поэтому давайте будем соблюдать рекомендации Microcoft по программированию под эту платформу".
Далее. Относительно смешивания обьектных и интерфейсных ссылок. Дело в том, что эти две модели подразумевают противоречивые модели управления временем жызни обьектов. И по-человечески эти противоречия не разрешить. Конечно, можно искать приключения на одно место. Но это уже из розряда LMD. Я понимаю, могут быть исключения в мелком проекте, в отдельном случае. Подробно комментированном. Но в большом - сорри. Даже как временная, и переходная мера. Здесь я напомню слова одной моей школьной учительницы: "Сначала думай, а тогда делай". Она их очень часто повторяла. Это раздражало. Но теперь есть понимание, что она правильно делала. И это, в общем, пошло на пользу.
> ЗЫ. Про ЛМД я запомню :)))
Да ладно, мне не жалко. Тем более, здесь не случай дыма без огня.
← →
Суслик © (2004-09-07 15:07) [268]
> vuk © (07.09.04 15:04) [266]
> Я не зря говорил, что хочу подробное описание, а не "хочу,
> чтобы былО". О трудностях надо думать заранее, до того,
> как громко говорить "хочу".
Алексей. Они (трудности) - разрешимы. Я привел одну из самых больших доделок, которые пришлось бы делать Борланду - дополнение информации о типах - иначе не будет корректно работать подчистка мусора из записей, классов и пр.
> о тут есть одна тонкость - правила работы с интерфейсами
> в Delphi соответствуют правилам работы с интерфейсами в
> COM
Радостно - значит я не потерян для COM - что-то знаю :))
← →
Ihor Osov'yak © (2004-09-07 15:08) [269]Microsoft конешно, сори.
← →
vuk © (2004-09-07 15:08) [270]to Суслик © (07.09.04 15:07) [268]:
>Они (трудности) - разрешимы.
Пути разрешения - в студию.
← →
Акуличев Дмитрий (2004-09-07 15:09) [271]
> Суслик © (07.09.04 14:51) [257]
Четыре свойства интерфейсов:
Устойчивость.
Набор реализуемых интерфейсов не должен меняться за время жизни объекта.
Рефлексивность.
Если A: IA, то A.QueryInterface(IA, x) = S_OK
Симметричность.
Если A: IA, B: IB, A.QueryInterface(IB, B) = S_OK, то B.QueryInterface(IA, x) = S_OK
Транзитивность.
Если A: IA, B: IB, C: IC, A.QueryInterface(IB, B) = S_OK, B.QueryInterface(IC, C) = S_OK, то A.QueryInterface(IC, C) = S_OK
← →
Суслик © (2004-09-07 15:11) [272]
> Ihor Osov"yak © (07.09.04 15:04) [267]
Спасибо за объяснения про то, что нужно соблюдать соглашения. Хорошо все объяснил.
> Но в большом - сорри. Даже как временная, и переходная мера.
Над тем и работаем, чтобы изничтожить - работы много.
← →
Romkin © (2004-09-07 15:13) [273]vuk © (07.09.04 14:57) [260] Дfвай :)) Возможно, я не точно выразился, каюсь.
program Project1;
{$APPTYPE CONSOLE}
type
IMyIntf = interface
procedure Show(msg: string); stdcall;
end;
TMyIntf = class(TInterfacedObject, IMyIntf)
procedure Show(msg: string); stdcall;
end;
var
MyIntf: IMyIntf;
{ TMyIntf }
procedure TMyIntf.Show(msg: string);
begin
writeln("AAA");
end;
begin
MyIntf := TMyIntf.Create;
MyIntf.Show("");
readln;
end.
Посмотри список загруженных модулей ;)
PS Delphi 6
← →
vuk © (2004-09-07 15:14) [274]to Акуличев Дмитрий (07.09.04 15:09) [271]:
>Набор реализуемых интерфейсов не должен меняться за время жизни
>объекта.
Кстати, как в этом отношении с агрегируемыми объектами быть, если устроить такую ситуацию, когда контейнер может предоставлять клиентам интерфейсы агрегируемых объектов как свои?
:o)
← →
Суслик © (2004-09-07 15:14) [275]
> vuk © (07.09.04 15:08) [270]
Давай сначала проблемы? Ты пока ни одной не привел...
> Акуличев Дмитрий (07.09.04 15:09) [271]
Спасибо.
Все же есть ощущение, что это из COM?
Я конечно внимательно прочел 267, про то, что интерфейсы вышли из ком? Но почему тогда нигде, где бы говорилось про интерфейсы в дельфи нет этих правил?.
← →
Акуличев Дмитрий (2004-09-07 15:16) [276]
> Суслик © (07.09.04 15:04) [265]
> Интересно где ты эти правила взял. Полагаю, что все-таки
> из книг по COM? Правила все логичные, но я их ни в одной
> книге по интерфейсам в дельфи ни в доке не видел.
>
> Так откуда ты их взял?
Интерфейсы появились отнюдь не в COM.
Впрочем, что взять с человека, который слова "много читаешь" использует как упрёк...
← →
Romkin © (2004-09-07 15:19) [277]Суслик © (07.09.04 15:04) [265] Это фактически цитата из "Сущность технологии СОМ" Дональда Бокса. Примерно то же самое можно найти и у др. Джейсона Причарда "СОМ и CORBA"
← →
Суслик © (2004-09-07 15:19) [278]
> Впрочем, что взять с человека, который слова "много читаешь"
> использует как упрёк...
Забей. Это не упрек. Дело в том, что начитанные люди не слушают друих и считают себя в праве давать оценки. Забей.
------------
Все же есть ощущение, что данные правила есть требования контекста. В данном случае COM. Если бы они были важны для реализации интерфейсов в дельфи как таковых, то об этом обязательно было бы сказано в соответсвующей литературе.
← →
Суслик © (2004-09-07 15:19) [279]
> Romkin © (07.09.04 15:19) [277]
> Это фактически цитата из "Сущность технологии СОМ" Дональда
> Бокса. Примерно то же самое можно найти и у др. Джейсона
> Причарда "СОМ и CORBA"
Вот! Все-таки COM...
← →
vuk © (2004-09-07 15:21) [280]to Romkin © (07.09.04 15:13) [273]:
>Посмотри список загруженных модулей
А разобраться, зачем это нужно, в RTL посмотреть? :o)
Страницы: 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 1.1 MB
Время: 0.139 c