Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-42463
Тарас
2001-12-25 11:26
2002.01.14
Как справиться с проблемкой


4-42602
Shmel
2001-11-06 01:07
2002.01.14
Как получить текст из ячеек TstringGrid в чужом окне? Handle я знаю.


3-42360
grab
2001-12-11 14:13
2002.01.14
заполнение БД данными из текстового файла


14-42544
Tosov
2001-11-16 17:18
2002.01.14
HDD: Что выбрать


1-42461
User
2001-12-25 08:49
2002.01.14
Как же мне отрисовать самому строки в TListView?





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