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