Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.14;
Скачать: CL | DM;

Вниз

Как создать 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
1-42405
Andrey196
2001-12-26 18:48
2002.01.14
Как в строку добавить значок


14-42557
VEG
2001-11-19 16:23
2002.01.14
Ут, блин, ФОРМАТЫ WAV:-(


14-42564
KLOP
2001-11-19 09:54
2002.01.14
МОДЕРАТОРУ


4-42612
sandman
2001-11-10 20:34
2002.01.14
Отсылка сообщения через OLE


1-42474
fliz
2001-12-25 12:55
2002.01.14
Запись в поток (SaveToStream) перестала работать после переноса проги на Вин2000.