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




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




Наверх





Память: 0.75 MB
Время: 0.026 c
4-42604           Vladimir P            2001-11-12 16:57  2002.01.14  
Как послать системе Ctrl+Alt+Del ?


1-42480           Ser_Kham1             2001-12-25 12:08  2002.01.14  
ListBox


4-42591           MIFI                  2001-11-09 17:31  2002.01.14  
Народ помогите разобраться


4-42623           Семён                 2001-11-10 09:36  2002.01.14  
Создание главной формы с помощью WinApi


14-42549          Бармен                2001-11-15 16:09  2002.01.14  
Народ, а кто каким средством для построения инсталляционных пакетов пользуется?