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

Вниз

Вопрос по OLE-Automation(ранние связывание)   Найти похожие ветки 

 
Fantasist   (2002-04-11 22:47) [16]


> чегото я уже нифига не понимаю кто из нас тупит..... и где
> то что ты написал(примеры разных типов связывания) я согласен
> все правильно только вот CreateOleObject() имеет тип IDispatch
> как ни крути(не верьшь нажми F1 в Delphi).......... а
> CreateOleObject() - это позднее связывание (объект создается
> во время выполнения приложения и на момент компиляции нам
> о его методах нифига не известно) если я не прав объясните
> где моя логика дала трещину.....
> Кстати в Automation есть еще интерфейс vTAble(Если чо)помимо
> "IDispatch и переменных типа Variant."


Так, интересно, давайте разберемся.
Что есть ранее и позднее связывание? Давайте определим так:
* ранее связывание - это вызовы методов через vtable.
* позднее - вызов методов через IDispatch::GetIDsOfNames() и IDispatch::Invoke()

Вроде не наврал. Давайте теперь специально лезу в Word2000.pas.
Метод Сonnect:

var
punk: IUnknown;
begin
if FIntf = nil then
begin
punk := GetServer;
ConnectEvents(punk);
Fintf:= punk as _Application;
end;
end;

вызываетcя TOleServer.GetServer и создается там это таким образом:


if not Succeeded(GetActiveObject(FServerData^.ClassId, nil, Result)) then
Result := CreateComObject(FServerData^.ClassId);


(Тут, кстати, используется GetActiveObject, как предлогал я)
Ага.Получаем IUnknown и преобразуем его к _Application, который является дуальным интерфейсом. Дальше методы TWordApplication вызываются используя этот интерфейс, значит по vtable, и значит тут все-таки ранее связывание согласно вышеданному соглашению(коламбур :) ), я ошибался. Почти. Ибо TWordApplicationProperties преобразует этот интерфейс к IDsipatch(через OleVariant) и пользуется им. Значит у нас присутсвуют оба способа связывания.

Vtable как и интерфейс относятся к понятию COM. Automatation - это технология использующая COM, так что их смешивать не надо. Хотя я тут говорить не буду, почему-то терминология в COM слегка не однозначна. Мне всегда казалось, что Automataion именно основан на использовании IDispatch и Variant. Но может где-то этот термин понимается по другому, или его надо понимать по другому.

И вот еще что. Когда вы делаете так:

var
Word:TWordApplication;
begin
Word:=TWordApplication.Create;
end;

вы создаете паскалевский(делфийский) экземпляр класса, но никак не СOM-объект. COM-объект создается уже внутри этого класса и к его созданию вы никакого отнашение не имеете и повлиять не можете. То, что я показывал в первом примере (с ShockWave) - это совсем другое.



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

Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.005 c
3-80772
alehan
2002-03-15 18:46
2002.04.25
TDateTimeField.EditMask


3-80799
Марина
2002-04-05 09:11
2002.04.25
Table is busy.User:???


1-80968
Rat King
2002-04-08 11:08
2002.04.25
Технология Plug-Insов


3-80803
trever
2002-04-05 10:22
2002.04.25
Помогите советом, пожалуйста!


1-81000
stormick
2002-04-12 19:35
2002.04.25
Кнопка на рабочем столе....





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский