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

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

Разница в вызовах методов [D6, Win95/98]


pasha_golub ©   (2004-06-29 15:09:00) 

Имеем СОМ-объект, например Document.Text и его метод CreateTextCursor.

Есть два докумментированных варианта вызова:
oCursor := Document.Text.CreateTextCursor;
и
oCursor := Document.Text.CreateTextCursor();

Так вот в первом случае все отрабатывает отлично, во втором случае сервер автоматизации сообщает об ошибке: "Несовпадение типов".

Однако меня это очень удивило, и я залез в окошко ЦПУ, нашел такие различия:


SampleCode.pas.203: oCursor := Document.Text.CreateTextCursor;
5104EF3B 68E8EF0451       push $5104efe8
5104EF40 68FCEF0451       push $5104effc
5104EF45 8D4318           lea eax,[ebx+$18]
5104EF48 50               push eax
5104EF49 8D45D8           lea eax,[ebp-$28]
5104EF4C 50               push eax
5104EF4D E84E61FBFF       call VariantManager + $90
5104EF52 83C40C           add esp,$0c
5104EF55 8D45D8           lea eax,[ebp-$28]
5104EF58 50               push eax
5104EF59 8D45E8           lea eax,[ebp-$18]
5104EF5C 50               push eax
5104EF5D E83E61FBFF       call VariantManager + $90
5104EF62 83C40C           add esp,$0c
...


VS


SampleCode.pas.203: oCursor := Document.Text.CreateTextCursor();
5104EF3B 68E8EF0451       push $5104efe8
5104EF40 6800F00451       push $5104f000
5104EF45 8D4318           lea eax,[ebx+$18]
5104EF48 50               push eax
5104EF49 8D45D8           lea eax,[ebp-$28]
5104EF4C 50               push eax
5104EF4D E84E61FBFF       call VariantManager + $90
5104EF52 83C40C           add esp,$0c
5104EF55 8D45D8           lea eax,[ebp-$28]
5104EF58 50               push eax
5104EF59 8D45E8           lea eax,[ebp-$18]
5104EF5C 50               push eax
5104EF5D E83E61FBFF       call VariantManager + $90
5104EF62 83C40C           add esp,$0c
...


Вопрос: чьи это промашки? Делфи, или не Делфи? Может быть Менеджера Вариантов (VariantManager)? И встречались ли вы с таким при работе с другими серверами автоматизации?


Romkin   (2004-06-29 16:02:00) [1]

А я откуда знаю? :))
Кстати, я постоянно в асе


pasha_golub   (2004-06-29 16:01:00) [2]

Romkin ©   (29.06.04 15:50) [10]
Хорошо, то есть получается, что спецы Sun выложили в документацию неработающий пример? Так это понимать? Или быть-может есть какая-то вариация между версиями Дельфи?


pasha_golub   (2004-06-29 16:01:00) [3]

Romkin ©   (29.06.04 15:50) [10]
Хорошо, то есть получается, что спецы Sun выложили в документацию неработающий пример? Так это понимать? Или быть-может есть какая-то вариация между версиями Дельфи?

ЗЫ И еще, Ром, выскочи в асю, плиз.


Romkin   (2004-06-29 15:50:00) [4]

Точнее, IDispatch.Invoke посмотри в MSDN хотя бы...
Истина в том, что при проектировании СОМ MS очень сильно шла на поводу у VB, и поэтому, если, например, метод описан как
MyMethod(First: OleVariant; Second: integer; Third: integer)
то допустимы вызовы
MyMethod(,, Third) и даже MyMethod(Second = ..., Third = ..., First = ...) :))
Как в VB. Поэтому, увидев скобки, Delphi, по-видимому, воспринимает это как (EmptyParam) - пропущенный параметр


Romkin   (2004-06-29 15:43:00) [5]

Что пихается - смотри вызов Invoke :))))
Но не советую


Dok_3D   (2004-06-29 15:41:00) [6]

Создал COM-объект.

У него одни метод:
 function TCOMTest.Method1: WideString;

Вызываю: его
var  VarCom : Variant;
begin
VarCom  := CreateOleObject('Test.COMTest');
VarCom.Method1();
end;

Получаю ошибку "Недопустимое число параметров."

Если вызываю без скобочек, то все нормально.

Странно, но истина где-то рядом...:)


pasha_golub   (2004-06-29 15:35:00) [7]

Romkin ©   (29.06.04 15:28) [5]
Действительно, написал грязное ругательное слово и компилятор прохавал. :-)


pasha_golub   (2004-06-29 15:32:00) [8]

Romkin ©   (29.06.04 15:28) [5]
Хм, спасибо. Но все-таки, если он пустой что же пихается?

Кстати, в SDK от Sun MicroSystems есть пример, из-за которого собственно и возник вопрос. Этот пример написан с использованием () и, ясен пень, не работает. А при замене, работает. Написано, что тестировано на Д5, я тестировал на Д6. Что же это получается, там работает, а тут нет? Я свято верю, что СанТехники проверили работоспособность кода :-)


Romkin   (2004-06-29 15:28:00) [9]

А, так у тебя variant? Сорри, это позднее связывание, и правила вызова процедур ничего общего с Delphi не имеют :)
 Document : variant;
Так после CreateOleObject после точки ты можешь хоть на русском писать, компилятор примет. Это не проверяется. А уж как дальше - все в соответствии с правилами уже СОМ идет, написано пустой список параметров - пихаем пустой :))


pasha_golub   (2004-06-29 15:20:00) [10]

Пробовал изменять Variant -->> OleVariant. Такая же хрень.

Я неспроста отметил жирным различия в асм-коде, разные значения на стек кладуться. А по идее не должны бы, ИМХО.


pasha_golub   (2004-06-29 15:16:00) [11]

var
oCursor : variant

Такое же наблюдается, и в случае если результат не присваивается ни чему. :(


Dok_3D   (2004-06-29 15:14:00) [12]

Никогда с таким не сталкивался.
Все ли тут чисто?

oCursor - переменная какого типа?


pasha_golub   (2004-06-29 15:13:00) [13]

Если поможет, то

var
    Document : variant;

...

Document := CreateOleObject(...);


Наверх

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