Форум: "Основная";
Текущий архив: 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