Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Разница в вызовах методов   Найти похожие ветки 

 
pasha_golub ©   (2004-06-29 15:09) [0]

Имеем СОМ-объект, например 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)? И встречались ли вы с таким при работе с другими серверами автоматизации?


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

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

var
    Document : variant;

...

Document := CreateOleObject(...);


 
Dok_3D ©   (2004-06-29 15:14) [2]

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

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


 
pasha_golub ©   (2004-06-29 15:16) [3]

var
oCursor : variant

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


 
pasha_golub ©   (2004-06-29 15:20) [4]

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

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


 
Romkin ©   (2004-06-29 15:28) [5]

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


 
pasha_golub ©   (2004-06-29 15:32) [6]

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

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


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

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


 
Dok_3D ©   (2004-06-29 15:41) [8]

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

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

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

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

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

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


 
Romkin ©   (2004-06-29 15:43) [9]

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


 
Romkin ©   (2004-06-29 15:50) [10]

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


 
pasha_golub ©   (2004-06-29 16:01) [11]

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


 
pasha_golub ©   (2004-06-29 16:01) [12]

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

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


 
Romkin ©   (2004-06-29 16:02) [13]

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
8-1082635528
vin
2004-04-22 16:05
2004.07.11
TImage с быстрым Zoom и Pan


1-1088181478
tamagavk
2004-06-25 20:37
2004.07.11
Рисунок в МEMO....


11-1075998835
BelchonokH
2004-02-05 19:33
2004.07.11
Иконки для форм со стилем fbsNone


14-1087754325
Knight
2004-06-20 21:58
2004.07.11
Путь Мастера...


1-1088596423
Snip
2004-06-30 15:53
2004.07.11
TListView