Как да създадете Ole обект ръчно, t

Как да създадете ръчно обект на Ole, т.е. без използване на tlb файл, без регистрация?

Никой не знае какво?

DLL, където се намира обектът ole, е функцията DllGetClassObject. Трябва да й се обадим.

> GreySerg (20.12.01 17:44)
Бихте обяснили проблема. Какъв сървър? (InProc или Local) Какъв вид интерфейс трябва да получите? (IDispatch или нещо друго). И без да регистрирате какво?

И тогава майсторите ще ви отговорят дали знаят или не.

Сървър - без значение какъв (вътрешен или външен). Интерфейс -IDispatch.
И без регистрация - просто се интересува от възможността за създаване на такъв сървър.

И защо такива мъки?

1. Изобщо не е необходимо да се създава отделен tlb/olb файл, обикновено библиотеката с типове се компилира със сървъра. Без информация за типовете, IDispatch няма да работи по принцип (използва се в методи, които осигуряват „късно“ свързване).

2. Регистрацията може да бъде избегната чрез пренаписване на изпълнението на регистрацията по подразбиране във вашия клас (не пишете в регистъра). Но без регистрация ще бъде невъзможно да се използва автоматизация.

И така, какъв е смисълът изобщо да се използва IDispatch?:)

И ако не IDispatch, как да пренапишете изпълнението на регистрацията по подразбиране във вашия клас (да не пишете в регистъра)? По възможност пример.

Не може да се опише с 2 думи, защото темата е сложна и обемна. Мога да препоръчам да отидете на http://www.techvanguards.com/stepbystep/comdelphi/, има много добър урок за COM програмиране в Delphi с многобройни примери (на английски).

Най-простото (за вътрешни сървъри) е да копирате изпълнението на функциите DllRegisterServer/DllUnregisterServer от ComServ.pas във вашия проект и да премахнете целия код за работа с системния регистър от тези функции.

За по-сложни неща ще трябва да напишете свои собствени заместители за класовете TComObject, TTypedComObject и много други.

P.S. Защото интерфейсите са само декларация за методи за достъп, тогава ако искате, можете да пишете всякакви внедряване в класовете по изпълнение
P.S. Все още не разбирам защо стандартните инструменти са толкова лоши:)

Да, няма да обичате да създавате OLE обект, без да се регистрирате в системния регистър. Може да има само едно извращение: заредете DLL във вашата програма и извикайте нейната функция DllRegisterServer () и след това опитайте да извикате необходимите методи на клас чрез IDispatch (но кой, откъде знаете?).

за InProc:
извикайте DllGetClassObject от dll, вземете препратка към IClassFactory

IClassFactory.CreateInstance - Поискайте препратка към IUnknown обект

Ако късно свързване без регистрация в регистъра - пренапишете методите за изпълнение на IDispatch (и в същото време ITypeLib, ITypeInfo.) - т.е. пълна имитация на OLE-Automation дръжки.

за местни:
внедряване на stub-proxy stub за междупроцесна комуникация (включително маршалиране на данни) - като цяло - gimor - за какво е.
(Въобще не говоря за DCOM.)

Може би по този начин е по-лесно?
Внедрете вътрешен обект от TInterfaceObject (ако не бъркате в името) - той е в dll и публикува в dll аналог на функцията DllGetClassObject - който създава този обект и връща IUnknown на този обект?

Напълно съм съгласен с последния P.S. у-мек

Не можах да разбера едно нещо от цялата тази дискусия: Защо се нуждаете от COM? COM е спецификация, която описва как клиентът и сървърът трябва да комуникират. И вие казвате: „Не искам да се придържам към тази спецификация!“ Отлично. ако не го искате, не го правете. бъди по твоя начин, но тогава не е COM. опишете вашия протокол за взаимодействие и дори можете да се конкурирате с Microsoft;), просто не питайте как написаното от вас може да бъде изтеглено обратно в COM.

Нещо подобно на OLE/COM може да бъде внедрено в следния сценарий.
1. Напишете фабрична функция на клас в DLL, която връща препратка към класа, чието име му се предава като текстов низ.
2. Клиентската програма зарежда тази DLL, извиква фабриката на класа, като й предава името на класа като параметър; създава екземпляр на клас - обект (TObject), използвайки връзката на получения клас (тип TClass), чиито методи могат да бъдат извикани по име (например: o.Invoke ("FirstMethod"; var Params; var Res)). (VCL разполага с всички необходими подробности за това под формата на собствено изпълнение на псевдо-COM).

Така че хипотетичен пример:

вар
c: TClass;
o: TObject;
res: Цяло число;
започнете
c: = DLLFactoryGetClass ("TMyClass"); // Получаване на препратка към класа TMyClass
o: = c.newInstance (); // Създаване на екземпляр на класа TMyClass
o.Invoke ("Add", [2,2], res); // Извикваме метод на екземпляр по име
WriteLn ("2 + 2 =", res); // Извеждане на резултата
край;

Да, забравих да кажа, всичко, което написах, се отнася само за собствените ми разработки в Delphi (DLL + програма) и това няма да има и най-малко отношение към OLE/COM.

За да създадете екземпляр на пълноправен обект OLE/COM на трета страна, се нуждаете от задълбочени познания за технологията на MS. Бих препоръчал да се обърнете към литературата ActiveX/OLE/COM, където това е описано с примери.

ВИЖТЕ ПОМОЩТА за Windows SDK на
CreateDispTypeInfo
CreateStdDispatch и т.н.