Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
ВнизКак создать Ole обьект вручную,т.е. не используя tlb файл, без регистрации? Найти похожие ветки
← →
GreySerg (2001-12-20 17:44) [0]Как создать Ole обьект вручную,т.е. не используя tlb файл, без регистрации?
← →
GreySerg (2001-12-20 18:02) [1]Чё никто не знает что ли?
← →
GreySerg (2001-12-20 18:35) [2]Мастера, вы где?
← →
Dimka Maslov (2001-12-20 18:50) [3]В dll где находится ole объект находится функция DllGetClassObject. Надо вызывать её.
← →
Suntechnic (2001-12-21 00:04) [4]> GreySerg (20.12.01 17:44)
Ты бы задачу объяснил. Что за сервер?(InProc or Local) Что за интерфейс получить надо?(IDispatch или что то другое). И без регистрации чего?
А потом мастера тебе ответят, знают они или нет...
← →
GreySerg (2001-12-21 15:09) [5]Сервер - не важно какой (внутренний или внешний). Интерфейс -IDispatch.
А без регистрации - это просто интересует возожность создания такого сервера.
← →
y-soft (2001-12-21 21:43) [6]А для чего такие мучения?
1.Совсем необязательно создавать отдельный файл tlb/olb, обычно библиотека типов компилируется вместе с сервером. Без информации о типах IDispatch работать в принципе не будет (она используется в методах, обеспечивающих "позднее" связывание).
2.Регистрации можно избежать, переписав в своем классе реализацию регистрации по умолчанию (не производить запись в Реестр). Но без регистрации невозможно будет воспользоваться автоматизацией.
Ну и какой смысл тогда вообще использовать IDispatch? :)
← →
GreySerg (2001-12-22 13:15) [7]> y-soft ©
А если не IDispatch , то как переписать в своем классе реализацию регистрации по умолчанию (не производить запись в Реестр)? Если можно пример.
← →
y-soft (2001-12-22 22:01) [8]В 2-х словах не описать, т.к. тема сложная и объемная. Могу посоветовать сходить на http://www.techvanguards.com/stepbystep/comdelphi/, там очень хорошее пособие по программированию COM на Delphi с многочисленными примерами (на английском).
Самое простое (для внутренних серверов)- скопировать из ComServ.pas реализацию функций DllRegisterServer/DllUnregisterServer в свой проект и удалить из этих функций весь код для работы с реестром.
Для более сложных вещей придется писать собственные замены классов TComObject, TTypedComObject и еще очень много чего...
P.S. Т.к. интерфейсы это всего лишь декларация методов доступа, то при большом желании можно написать любую реализацию в имплементирующих классах
P.S. Я все-таки не понимаю, чем так плохи стандартные средства :)
← →
iZEN (2001-12-22 22:55) [9]Да, без регистрации в реестре создать OLE-объект никак не полючится. Изврат один может быть: загрузить DLL в свою программу и вызвать её функцию DllRegisterServer(), а потом пробовать через IDispatch вызывать нужные методы класса (но какого, как узнать?).
← →
kig (2001-12-22 23:53) [10]для InProc:
из dll вызвать DllGetClassObject, получить ссылку на IClassFactory
IClassFactory.CreateInstance - запросить ссылку на IUnknown объекта
IUnknown.QueryInterface - ссылка на интерфейс (_addref и _release надо на всякий случай не забыть)
Если использовать его напрямую (без позднего связывания) - просто вызывать его методы...
Если позднее связывание без регистрации в регистре - переписать методы реализации IDispatch (а заодно ITypeLib, ITypeInfo ...) - т.е. полная иммитация OLE-Automation ручками...
для local:
реализация заглушек stub-proxy для межпроцессного обмена (в том числе маршалинг данных) - вообщем - гимор - для чего он нужен???
(Про DCOM вообще не говорю...)
Может так проще?
Реализовать внутренний объект от TInterfaceObject (если не ошибся в названии) - его в dll и вывесить в dll аналог ф-ции DllGetClassObject - создающая это объект и возращающая IUnknown этого объекта?
Полностью согласен с последним P.S. y-soft
← →
Suntechnic (2001-12-23 01:36) [11]Я вот одного понять не смог со всей это дискусси: Зачем тебе COM то понадобился? COM это спецификация, описывающая как должны взаимодействовать клиент и сервер. А ты заявляешь: "А я не хочу предерживаться этой спецификации!"... Отлично... не хочешь, не надо... будь по твоему, но тогда это не COM... описывай свой протокол взаимодействия и можешь даже поконкурироваться с Microsoft ;), только не спрашивай как то, что ты написал, притянуть за уши назад в COM.
← →
iZEN (2001-12-23 06:42) [12]Нечто подобное OLE/COM можно реализовать по следующему сценарию.
1. Написать в DLL функцию-фабрику классов, которая возвращает ссылку на класс, имя которого передано ей в виде текстовой строки.
2. Программа-клиент загружает эту DLL, вызывает фабрику класса, передавая ей имя класса как параметр; создаёт по полученной классовой (типа TClass) ссылке экземпляр класса -- объект (TObject), методы которого можно будет вызвать по именам (например: o.Invoke("FirstMethod"; var Params; var Res)). (В VCL для этого есть все необходимые детали в виде собственной реализации псевдо-COM).
Итак, гипотетический пример:
var
c: TClass;
o: TObject;
res: Integer;
begin
c := DLLFactoryGetClass("TMyClass");//Получение ссылки на класс TMyClass
o := c.newInstance();//Создание экземпляра класса TMyClass
o.Invoke("Add", [2,2], res);//Вызов метода экземпляра по имени
WriteLn("2+2=", res);//Вывод результата
end;
← →
iZEN (2001-12-23 06:51) [13]Да, забыл сказать, всё, что я написал, относится только к собственным разработкам в Delphi (DLL+Программа), а к OLE/COM это уже не будет иметь ни малейшего отношения.
← →
iZEN (2001-12-23 06:55) [14]Для инстанцирования стороннего полноценного OLE/COM-объекта от Вас потребуется доскональное знание MS-технологии. Я бы порекомендовал обратится к литературе по ActiveX/OLE/COM, где это описывается с примерами.
← →
АНАТОЛИЙ (2001-12-25 17:39) [15]ДЛЯ GreySerg
СМОТРИ Windows SDK HELP по
CreateDispTypeInfo
CreateStdDispatch и т.Д.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c