Кто-нибудь обяснит мне следующую выдержку из дельфёвого хелпа:
"After successfully obtaining an interface by calling QueryInterface, clients should increase the reference count by calling the IUnknown AddRef method."
Может с английским у меня совсем плохо, но я понял это так что нужно вызывать AddRef после QueryInterface. Хотя по стандартам COM при успешном вызове QueryInterface он сам должен увеличить счётчик ссылок на интерфейс (как это и происходит в VC++). Т.е. Delphi клала на эти правила?
Вопрос возник в связи со следующим. Есть у меня в проге код
В таком виде при попытке присвоить ASRprovider nil или вызвать _Realese приводит к великому Access Violetion.
Если раскоментарить, то всё работает хорошо.
Может кто подскажет в чём дело? Единственно что меня тревожит, это то что QueryInterface и _Realese вызываются в разных процедурах. Может у дельфи есть какие-то заморочки по этому поводу?
P.S. Что бы отсечь не нужные ответы скажу что ASRProvider объявленна глобально (автоматически не может освобождаться, да и не посредственно перед вызовом _Realese вызывается функция из интерфейса и всё работает корректно). Так же ASRProvider вообще не передаётся ни в какие процедуры в качестве параметра, поэтому дельфёвых заморочек с вызовом _Realese для интерфейсов переданных в качестве параметра не может быть.
Здравствуйте maxus_k, Вы писали:
MK>Кто-нибудь обяснит мне следующую выдержку из дельфёвого хелпа: MK>"After successfully obtaining an interface by calling QueryInterface, clients should increase the reference count by calling the IUnknown AddRef method."
MK>Может с английским у меня совсем плохо, но я понял это так что нужно вызывать AddRef после QueryInterface. Хотя по стандартам COM при успешном вызове QueryInterface он сам должен увеличить счётчик ссылок на интерфейс (как это и происходит в VC++). Т.е. Delphi клала на эти правила?
при чем здесь Delphi??? счетчики ссылок в COM серверах а не в Delphi... MK>Вопрос возник в связи со следующим. Есть у меня в проге код
MK> Unknown.QueryInterface( I_ASRProvider , ASRProvider); MK>// ASRProvider._AddRef;
MK>В таком виде при попытке присвоить ASRprovider nil или вызвать _Realese приводит к великому Access Violetion. MK>Если раскоментарить, то всё работает хорошо. MK>Может кто подскажет в чём дело? Единственно что меня тревожит, это то что QueryInterface и _Realese вызываются в разных процедурах. Может у дельфи есть какие-то заморочки по этому поводу? MK>P.S. Что бы отсечь не нужные ответы скажу что ASRProvider объявленна глобально (автоматически не может освобождаться, да и не посредственно перед вызовом _Realese вызывается функция из интерфейса и всё работает корректно). Так же ASRProvider вообще не передаётся ни в какие процедуры в качестве параметра, поэтому дельфёвых заморочек с вызовом _Realese для интерфейсов переданных в качестве параметра не может быть.
Возможно, что I_ASRProvider кладет на правильный инкремент счетчика указателей, а возможно (скорее всего), что Unknown — локальная переменная. если второе — вынеси ее в более глобальный контекст — и все пройдет, ибо Delphi автоматически вызывает _Release для переменных, область видимости которых заканчивается, например — по концу процедуры или по уничтожении объекта — контейнера.
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
HD>при чем здесь Delphi??? счетчики ссылок в COM серверах а не в Delphi...
Так а я о чём. Зачем написано что клиент должен увеличивать счётчик ссылок?
"clients should increase the reference count by calling the IUnknown AddRef method."
HD>Возможно, что I_ASRProvider кладет на правильный инкремент счетчика указателей, а возможно (скорее всего), что HD>Unknown — локальная переменная. если второе — вынеси ее в более глобальный контекст — и все пройдет, ибо Delphi HD>автоматически вызывает _Release для переменных, область видимости которых заканчивается, например — по концу HD>процедуры или по уничтожении объекта — контейнера.
Причём тут Unknown??
И к тому же она глобалная по самый не балуйся
Re: COM + Delphi = ???
От:
Аноним
Дата:
26.08.02 07:39
Оценка:
Здравствуйте maxus_k, Вы писали:
MK>Кто-нибудь обяснит мне следующую выдержку из дельфёвого хелпа: MK>"After successfully obtaining an interface by calling QueryInterface, clients should increase the reference count by calling the IUnknown AddRef method."
MK>Может с английским у меня совсем плохо, но я понял это так что нужно вызывать AddRef после QueryInterface. Хотя по стандартам COM при успешном вызове QueryInterface он сам должен увеличить счётчик ссылок на интерфейс (как это и происходит в VC++). Т.е. Delphi клала на эти правила?
вот выдержка из Help'a
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.
Здравствуйте Аноним, Вы писали: MK>>"After successfully obtaining an interface by calling QueryInterface, clients should increase the reference count by calling the IUnknown AddRef method."
А>вот выдержка из Help'a
А>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.
Так в чём же правда то? Как-то они противоречат друг-другу
Re[3]: COM + Delphi = ???
От:
Аноним
Дата:
26.08.02 07:49
Оценка:
Здравствуйте maxus_k, Вы писали:
MK>Здравствуйте Аноним, Вы писали: MK>>>"After successfully obtaining an interface by calling QueryInterface, clients should increase the reference count by calling the IUnknown AddRef method."
А>>вот выдержка из Help'a
А>>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.
MK>Так в чём же правда то? Как-то они противоречат друг-другу
Скорее всего твоя цитата относилась к локальным переменным, чтоб раньше времени объект не грохнулся.
Здравствуйте Аноним, Вы писали:
А>Скорее всего твоя цитата относилась к локальным переменным, чтоб раньше времени объект не грохнулся.
Да нет, ни к этому. Это TInterfacedObject.QueryInterface описывается и ещё где-то было.
Короче, это ещё одна из возможностей дельфи по написанию "надёжных приложений", наряду с TTimer, TThread.
Re[5]: COM + Delphi = ???
От:
Аноним
Дата:
26.08.02 08:04
Оценка:
Здравствуйте maxus_k, Вы писали:
MK>Здравствуйте Аноним, Вы писали:
А>>Скорее всего твоя цитата относилась к локальным переменным, чтоб раньше времени объект не грохнулся.
MK>Да нет, ни к этому. Это TInterfacedObject.QueryInterface описывается и ещё где-то было.
Где ты это находишь????
Вот тебе описание TInterfacedObject.QueryInterface из Help'a.
Do not call the protected QueryInterface method directly. QueryInterface is called through the IInterface interface to obtain an interface pointer for the interface identified by the IID parameter. If the object supports the requested interface, it is returned in the Obj parameter and QueryInterface returns S_OK. If the object does not support the interface, QueryInterface returns E_NOINTERFACE.
If QueryInterface successfully returns an interface pointer, it automatically increments the reference count.
Здравствуйте maxus_k, Вы писали:
HD>>при чем здесь Delphi??? счетчики ссылок в COM серверах а не в Delphi...
MK>Так а я о чём. Зачем написано что клиент должен увеличивать счётчик ссылок? MK>"clients should increase the reference count by calling the IUnknown AddRef method."
HD>>Возможно, что I_ASRProvider кладет на правильный инкремент счетчика указателей, а возможно (скорее всего), что HD>Unknown — локальная переменная. если второе — вынеси ее в более глобальный контекст — и все пройдет, ибо Delphi HD>автоматически вызывает _Release для переменных, область видимости которых заканчивается, например — по концу HD>процедуры или по уничтожении объекта — контейнера.
MK>Причём тут Unknown?? MK>И к тому же она глобалная по самый не балуйся
А A/V возникает именно во время вызова _Release или позже???
и нет-ли далее присвоения nil ???
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[7]: COM + Delphi = ???
От:
Аноним
Дата:
26.08.02 08:15
Оценка:
Здравствуйте maxus_k, Вы писали:
MK>Здравствуйте Аноним, Вы писали:
MK>Нескромный вопрос: это к какой делфе хелп? Может они в 6 поправили.
Здравствуйте Hacker_Delphi, Вы писали:
HD>А A/V возникает именно во время вызова _Release или позже???
Да именно во время вызова _Release
HD>и нет-ли далее присвоения nil ???
Нет, не присваеваеться.
Вроде нашёл как лечит, но вопрос о правильности работы дельфи всёравно остаёться.
Код выглядел так :
Unknown.QueryInterface( I_ASRProvider , ASRProvider);
ASRProvider._AddRef;
Unknown._Release;
так вот, если закоментарить последнюю строку то всё работает инче нет.
Хотя удаление Unknown полсе получение нужного интерфеса обычная практика на том же VC++.
По этому поводу есть что сказать?
Re[5]: COM + Delphi = ???
От:
Аноним
Дата:
26.08.02 08:24
Оценка:
Здравствуйте maxus_k, Вы писали:
MK>Здравствуйте Hacker_Delphi, Вы писали:
HD>>А A/V возникает именно во время вызова _Release или позже???
MK>Да именно во время вызова _Release
HD>>и нет-ли далее присвоения nil ???
MK>Нет, не присваеваеться.
MK>Вроде нашёл как лечит, но вопрос о правильности работы дельфи всёравно остаёться.
MK>Код выглядел так : MK> Unknown.QueryInterface( I_ASRProvider , ASRProvider); MK> ASRProvider._AddRef; MK> Unknown._Release;
MK>так вот, если закоментарить последнюю строку то всё работает инче нет. MK>Хотя удаление Unknown полсе получение нужного интерфеса обычная практика на том же VC++. MK>По этому поводу есть что сказать?
У тебя Unknown случайно не локальная переменная ????
Здравствуйте Аноним, Вы писали:
А>Здравствуйте maxus_k, Вы писали:
MK>>Здравствуйте Аноним, Вы писали:
А>>>У тебя Unknown случайно не локальная переменная ????
MK>>Нет!
А>Если хочешь, то кинь кодярник на tavwizard@mail.ru посмотрю
Спасибо за предложение, у меня всё работет. Мне не понятно было почему в дельфе не как в VC++( всё просто, красиво и надёжно, и что самое главное по правилам).
"Становилось всё чудесатее и чудесатее"
Алиса
Re[9]: COM + Delphi = ???
От:
Аноним
Дата:
26.08.02 08:44
Оценка:
Здравствуйте maxus_k, Вы писали:
MK>Спасибо за предложение, у меня всё работет. Мне не понятно было почему в дельфе не как в VC++( всё просто, красиво и надёжно, и что самое главное по правилам).
Так вот и мне интересно стало, что ты там такое написал. У меня таких проблем не возникало.
Здравствуйте Аноним, Вы писали:
А>Здравствуйте maxus_k, Вы писали:
MK>>Спасибо за предложение, у меня всё работет. Мне не понятно было почему в дельфе не как в VC++( всё просто, красиво и надёжно, и что самое главное по правилам).
А>Так вот и мне интересно стало, что ты там такое написал. У меня таких проблем не возникало.
Да у меня тоже таких проблем не было пока пользовался всякими TInterfacedObject или as. Вот решил по "пацановски"
написать, да видно в дельфях это нельзя.
Здравствуйте maxus_k, Вы писали:
MK>Здравствуйте Hacker_Delphi, Вы писали:
HD>>А A/V возникает именно во время вызова _Release или позже???
MK>Да именно во время вызова _Release
HD>>и нет-ли далее присвоения nil ???
MK>Нет, не присваеваеться.
MK>Вроде нашёл как лечит, но вопрос о правильности работы дельфи всёравно остаёться.
MK>Код выглядел так : MK> Unknown.QueryInterface( I_ASRProvider , ASRProvider); MK> ASRProvider._AddRef; MK> Unknown._Release;
MK>так вот, если закоментарить последнюю строку то всё работает инче нет. MK>Хотя удаление Unknown полсе получение нужного интерфеса обычная практика на том же VC++. MK>По этому поводу есть что сказать?
А строчки
Unknown := nil;
у тебя там нету?
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))