Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.041 c
3-1086933026
Pipl
2004-06-11 09:50
2004.07.11
SQL запрос


1-1088419919
Luarvic
2004-06-28 14:51
2004.07.11
Текстовые файлы


4-1085984224
Сергей Ю.
2004-05-31 10:17
2004.07.11
ShellHook без Explorera


14-1088082581
RealRascal
2004-06-24 17:09
2004.07.11
Fuzz


14-1087502053
lak
2004-06-17 23:54
2004.07.11
клава с японским





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский