Létrehozása com-szerver, delphisite

Ahhoz, hogy hozzon létre egy Delphi COM-kiszolgáló biztosít egy sor varázslók automatizálására rutin feladatok és lehetővé teszi a programozó koncentrálni végrehajtásáról szóló funkciót. Wizards érhetők el a menü paranccsal File-> New ActiveX lap
Ahhoz, hogy a COM-kiszolgáló EXE-fájlt, akkor egyszerűen meg kell hozzá egy modult használó COM-objektumokat. Ahhoz, hogy hozzon létre egy COM-kiszolgálót egy DLL, akkor először létre kell hozni egy könyvtárat, strukturált, hogy megfeleljen a követelményeknek COM. Ezt használja a varázsló «ActiveX Library». Az ő választása egy új projekt jön létre, és generált DLL végrehajtja a következő kódot:

Alapítva DLL exportál szükséges funkciókat COM és nem tud vigyázni a rutin munka, és azonnal kezdjük végre COM-servera.Dlya Ehhez válassza ki a mester «COM-objektum”.
Kitöltésével a mezőket az űrlapon végrehajtásától függ a COM-objektum létre
ClassName Delphi osztály nevét, amely megvalósítja a COM-kiszolgáló. A varázsló létrehoz egy üres osztályt az azonos nevet. Ugyanazon a néven a COM-kiszolgáló lesz a következő registry.
Instansing Meghatározza a mód létrehozását COM-objektumokat. Egy paraméter a következő értékeket: Belső A tárgy csak akkor használható az alkalmazás. Single Instance egy példányának létrehozása minden objektum vezet, hogy indítson egy új példányt az alkalmazás szerver. Miután létrehozott egy objektumot „Object Factory” alkalmazás eltávolítja a személyes adatokat a rendszerből listáját regisztrált gyárak, ami COM hogy hozzon létre egy új objektumot futtatni a szerver az új eljárás alkalmazása több Bíróság, miután példány létrehozásához „gyári” objektum nem távolítja el magát a listán regisztrált. Amikor létrehoz egy kérelmet egy új COM objektum észleli azt a listában, és kérheti a teremtés ugyanabban a gyárban, és egy új példányt az objektum jön létre, hogy ugyanezt a kérelmet. Más szóval, hogy hozzon létre minden ilyen típusú objektum budt futó legfeljebb egy szerver példány. Ez a lehetőség csak akkor van értelme az EXE-szerver, akkor figyelmen kívül hagyja a DLL.

Threading Model streaming szerver modell. Ez a beállítás függ, hogy milyen típusú szerver (EXE vagy DLL) Single nincs menet támogatást. Mert DLL-szerver a regisztráció során nem ThreadingModel beállítás jön létre az EXE-szerver ezt a beállítást (ellentétben más) nem telepíthető IsMultiThread zászló lesz beállítva STA. Jellemzően ezt a modellt alkalmazzuk az Internal Server lakást egy DLL szerver a registry jön létre opció ThreadingModel = Apartment, EXE - létrehozott MTA Mind az adatbázisban a DLL szerver - létrehozott STA Free lehetőség ThreadingModel = Free, EXE jön létre a DLL szerver a regisztrációs paramétert ThreadingModel = Mindkét, EXE - létrehozott MTA

Tartalmazza Type Library bejelöli ezt a négyzetet, hogy szerepel a típuskönyvtárat szerver - egy speciális bináris erőforrás, amely leírja a felületek megvalósított szerver, módszereik és vételi opcióval. COM egy szabványos eszközökkel dolgozó Típuskönyvtárak. Különösen Delphi lehet importálni a meglévő, a kiszolgáló típusát könyvtár és automatikusan épít rá egy interfész modul együtt dolgozni vele. Amikor a típuskönyvtárat interfészek segítségével írjuk le Type Library-szerkesztő. Az objektum örökli TTypedComObject Ha ez az opció ki van kapcsolva, akkor az objektum örökölt TComObject. Ez egy könnyű megvalósítást.

Megvalósult interfészek Ez a mező csak akkor engedélyezett, ha az objektum nem használ típusfüggvénytár. Ebben az esetben meg kell leírni a felületek maguk a kódot a program, és azokat ezen a területen, mint például a «iTest, IAnotherTest»

Mark felület Oleautomation beállítása ezt a zászlót teszi a COM-kiszolgáló összeegyeztethető OLE Automation. Akkor érdemes használni csak kompatibilis OLE Automation adattípusok a felület módszereket. Erre azért van szükség, ha azt szeretné, hogy adja át egy hivatkozás egy interfész a különböző „szoba”. Egy ilyen művelet, az úgynevezett rendező felület írását teszi szükségessé a speciális proxy / ág DLL. Azonban, ha a felület van megjelölve Oleautomation a munkát előtérügyeletes OLE és akkor elkerülhetjük a szükségtelen munkát.
. Támogatására Oleautomation rendező szükséges, hogy: • a szerver már örökölt TTypedComObject (IDispatch végrehajtása nem szükséges) • Minden interfész módszereket kell deklarálni safecall. Ha egy interfész osztályból származik IUnknown, akkor alapértelmezés szerint valamennyi módszer nyilvánították stdcall. Létrehozásához safecall módszereket kell Eszközök-> Environment Options párbeszédablak a lap Type Library Állítsa a kapcsolót Safecall térképészeti értékének minden v-asztal interfészek
Szerver nélkül típuskönyvtár
Egy ilyen szerver, ha nem hajtja végre IMarshall interfész csak akkor működhet egy „szoba” az ügyfél, így csak akkor kell használni In-Process Server streaming modell megegyezik az ügyfél.
Amikor létrehoz egy szerver, amely nem tartalmazza a típustárat meg kell mondani a varázsló interfészek végre őket. Adjon meg egy nevet iTest felületen. Az adagolás befejezése után a varázsló, a következő modul jön létre:

Windows ActiveX, osztályok, ComObj;

TTEST = osztály # 40; TComObject, iTest # 41;

TComObjectFactory. teremt # 40; COMSERVER, TTEST, Class_Test,

'Test'. ''. ciMultiInstance, tmApartment # 41; ;

Ha létrehoz egy COM-kiszolgáló, amelyet fel lehet használni a különböző ügyfelek (és nem csak egy adott projekt, amelyben az ügyfelek előírások szigorúan meghatározott) nem ajánlott szerverek támogatása nélkül adatokat rendező, mert ebben az esetben lehetetlen, hogy biztos, hogy a megállapítás, hogy az azonos „szoba „az ügyféllel. Ha mégis, hogy egy ilyen szerver - szükség van, hogy az tükrözze a vonatkozó előírásoknak az ügyfél dokumentációját rajta.
Nézzük meg a generált kód részletesebben. Különösen érdekes az inicializálási szakaszban. Ez létrehoz egy példányt „tárgy gyár» - COM-szerver, amely megvalósítja az interfészt IClassFactory2. Számára COM törekszik egy példányának létrehozásához az objektum vizsgálat. VCL automatikusan végrehajtja az összes rutin munka kölcsönhatás COM.
írásához szükséges a felület modul leírása a felület a megvalósítást. Ezen felül, akkor benyújtja a leírását állandók Class_Test és add meg a vonalat modul az egység1

eljárás ShowIt # 40; S: String # 41; ;

Ez a modul tartalmazza az összes szükséges információt a szerver és a kliens kell használni, ha a fordítás.
Mi kiegészítésére COM objektum-kód végrehajtását az interfész mód:

Windows ActiveX, osztályok, ComObj, TestInterface;

TTEST = osztály # 40; TComObject, iTest # 41;

eljárás ShowIt # 40; S: String # 41; ;

MessageBox # 40; 0. PChar # 40; S # 41;. NIL. 0 # 41; ;

TComObjectFactory. teremt # 40; COMSERVER, TTEST, Class_Test,

'Test'. ''. ciMultiInstance, tmApartment # 41; ;

Fordítsuk le a projekt, mi lesz a fájl Project1.dll
Az utolsó lépés, hogy regisztrálja a COM-kiszolgáló.
A parancssorba: «regsvr32 project1.dll»
Ha mindent helyesen tette, a képernyőn megjelenít egy üzenetet a sikeres regisztráció: «DllRegisterServer in Project1.dll sikerült».
Ön készen áll, hogy írjon az ügyfélnek. Ehhez hozzon létre egy új projektet, adjunk hozzá egy modult a fő formája használ TestInterface vonal és írjuk be a következő kódot:

használja TestInterface, ComObj;

eljárás TForm1. Button1Click # 40; Sender: TObject # 41; ;

Teszt: = CreateComObject # 40; Class_Test # 41; mint iTest;

Test. ShowIt # 40; 'Hi' # 41; ;

Amint látható, ez a példa, hogy hozzon létre, és a COM-kiszolgáló nem nehezebb, mint a munka hagyományos Delphi osztályok. nélkül típuskönyvtár szerver egy jó választás a végrehajtás a COM-kiszolgálók a projekt keretében, hiszen használata szükséges interfész modul. Ha a szerver át más fejlesztők meg kell adni nekik ezt a modult, és ha szükséges, lefordítani más nyelvre (például C).
Szerver típusú könyvtár
Könyvtár típusú - egy speciális bináris erőforrás, amely leírja a felületek és módszerek által végrehajtott COM-kiszolgáló. Eltekintve attól, hogy a típustárat szerver támogatja IProvideClassInfo felületet. A Delphi ilyen szerveren van megvalósítva eredő azt TTypedComObject. Ehhez hagyja a négyzetet Tartalmazza Type Library Wizard COM-kompatibilis objektumot.
Hozzon létre egy COM-kiszolgáló formájában EXE (persze, akkor is létre, és egy DLL).
Először hozzon létre egy új projektet (File-New Application), majd adja hozzá a COM-objektumot.
Ha nem szüntesse meg a bejelölést bele Type Library, a varázsló nem csak egy, hanem két modult. Az első emlékezteti a korábban létrehozott.

Windows ActiveX, osztályok, ComObj, Project1_TLB, StdVcl;

TTest1 = osztály # 40; TTypedComObject, ITest1 # 41;

TTypedComObjectFactory. teremt # 40; COMSERVER, TTest1, Class_Test1,

ciMultiInstance, tmApartment # 41; ;

ITest1 = interfész # 40; IUnknown # 41;

funkció ShowIt # 40; const S: WideString # 41;. HRESULT; stdcall;

És egység1 modul:

TTest1 = osztály # 40; TTypedComObject, ITest1 # 41;

funkció ShowIt # 40; const S: WideString # 41;. HRESULT; stdcall;

működni TTest1. ShowIt # 40; const S: WideString # 41;. HRESULT;

Mi csak levelet módszer végrehajtását:

működni TTest1. ShowIt # 40; const S: WideString # 41;. HRESULT;

MessageBoxW # 40; 0. PWideChar # 40; S # 41;. NIL. 0 # 41;

Eredmény: = S_OK; // standard siker kód

A regisztrációhoz a szerver elég egyszer futtatni a kliens számítógépen.