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