Главная страница
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.033 c
3-1087286955
kalishenko
2004-06-15 12:09
2004.07.11
Связь контролов в DLL и IB компонент проложения


1-1088180801
Yustas
2004-06-25 20:26
2004.07.11
Изменить значение по памяти по адресу


1-1087988428
Сашка
2004-06-23 15:00
2004.07.11
Отлов расстыковки


1-1088056076
Alfer
2004-06-24 09:47
2004.07.11
утечка памяти


1-1088501501
GooFfy
2004-06-29 13:31
2004.07.11
Использование помощи