TLB ( Type L i b rary - type library) on hierarkkinen tietojen tallennus ActiveX-palvelimen ominaisuuksista OLE Automationissa .
Tyyppikirjasto on yksi OLE Automation - tekniikan avainkäsitteistä . Tyyppikirjasto on hierarkkinen (kolmitasoinen, juurielementti laskettuna) tietotallennus ActiveX - palvelimen ominaisuuksista. Useimmiten tyyppikirjasto tallennetaan joko erillisenä tiedostona ".tlb"- tai ".olb"-tunnisteella tai sen kuvaaman ActiveX-komponentin [1] sisään ( resursseihin ) . Lisäksi tyyppikirjasto voi sijaita OLE - yhdistelmädokumentissa .
ActiveX-tekniikan myötä tarvittiin yksi suositeltu tapa saada yksityiskohtaista tietoa ActiveX-komponentista: luettelo sen toteuttamista luokista ja tuetut rajapinnat , niiden tunnisteet, lyhyet kuvaukset ja paljon muuta. Tätä tarkoitusta varten otettiin käyttöön tyyppikirjastot.
Tyyppikirjasto on kolmitasoinen hierarkkinen tallennustila: hierarkian kärjessä on itse kirjasto ( eng. Type Library ), joka on joukko tyyppikuvauksia ( eng. Type Info ), jotka puolestaan ovat kolmannen tason säiliöitä. -tason elementit - jäsenet ( eng. Member ).
Kaikilla kolmella elementillä on samat perusominaisuudet:
Lisäksi kirjastolla ja konekirjoituksella on yksilölliset 128-bittiset tunnisteet , kun taas jäsenillä on 32-bittiset tunnisteet (ainutlaatuiset samassa konekirjoituksessa). Kirjaston tunnus on LIBID , jäsentunnus on MEMBERID . Tyyppimäärittelytunnisteen nimi riippuu tyyppimääritelmän tyypistä.
Tyyppikirjasto voi kuvata kahdeksan erilaista entiteettiä. Jokainen tyyppikuvaus määrittelee yhden niistä. Tämän mukaisesti tyyppikuvauksen jäsentämisessä ensiarvoisen tärkeä tyyppikuvauksen attribuutti on tyypin kuvaustyyppi ( eng. Type Kind ). Tämä attribuutti määrittää, minkä tyyppistä entiteettiä annettu konekirjoitus kuvaa, ja siten määrittää, kuinka kaikki muut konekirjoituksen parametrit ja alielementit tulee tulkita.
Seuraava taulukko näyttää mahdolliset entiteettityypit:
Essence | Jäsenet | Tyyppi Kind | ID-nimi |
---|---|---|---|
Luettelo _ | Vakiot | TKIND_ENUM | — |
Unioni_ _ | Unionin kentät | TKIND_UNION | — |
Rakenne [2] | Rakennekentät | TKIND_RECORD | — |
COM-liitäntä | Metodit , ominaisuudet , luokkakentät , tapahtumat |
TKIND_INTERFACE | IID (Interface ID) |
Näytön käyttöliittymä [3] | TKIND_DISPATCH | ||
COM-luokka | Tuetut COM-liitännät | TKIND_COCLASS | CLSID (luokan tunnus) |
Nimimerkki | — | TKIND_ALIAS | — |
tavallinen moduuli | Funktiot , ominaisuudet, muuttujat |
TKIND_MODULE | — |
TLB sisältää useita tärkeitä tietoja, joita tarvitaan sekä sovellusten kehittämisen että käytön aikana.
Tallennetun tiedon näkökulmasta kirjasto on edistyneempi [5] otsikkotiedostojen analogi .
OLE API tarjoaa toimintoja [6] , joiden avulla voit ladata ja työskennellä tyyppikirjaston kanssa ITypeLib- ja ITypeLib2-rajapintojen kautta sekä siihen tallennettujen entiteettien kanssa ITypeInfon ja ITypeInfo2:n kautta.
Visual Basicille TLB-tuki on luonnollista ja kiinteää, koska tämä on ainoa mekanismi, jolla voit tuoda tietoa olemassa olevista liitännöistä, luokista, tyypeistä projektin nimiavaruuteen: kielellä voit ilmoittaa omia, uusia rajapintoja ja luokkia, mutta ei ole olemassa [7] . Joten esimerkiksi suurin osa kielen "sisäisistä" funktioista, tyypeistä, luokista ja liitännöistä on ilmoitettu vastaavissa tyyppikirjastoissa.
Tyyppikirjasto liitetään projektiin Projekti→Referenssit (tai epäsuorasti Projekti→Komponentit) kautta. Useita "perus"kirjastoja on mukana alusta alkaen, eikä niitä voi poistaa käytöstä.
Microsoft Visual C++MSVC++ on täydennetty erityisellä esikäsittelyohjeella #import , joka luo erillisen nimiavaruuden plug-in-tyyppikirjastolle [8] ja jokaiselle kirjastossa kuvatulle entiteetille vastaavan C++-yhteensopivan ilmoituksen.
Esimerkki:
// Tuo tyyppikirjasto tlb-tiedoston nimellä #import "../tlb/foobar.tlb" // Tuo tyyppikirjasto PE-tiedostoresursseista #import "winhttp.dll" // Tuo kirjasto sen LIBID-tunnuksella #import "libid:1234-1234-1234-123412341234" Borland Delphi ja Borland C++ BuilderNäissä kehitysympäristöissä on ohjattu komponenttien tuontitoiminto ( eng. Import Component Wizard ), joka on käytettävissä valikosta Komponentti→Import komponentti, jonka avulla voit luoda vastaavan pas- tai h-tiedoston tyyppikirjastoon perustuvilla määrityksillä.
PHPPHP:ssä on com_load_typelib()- funktio , joka lataa tyyppikirjaston ja rekisteröi vakiot kyseisestä kirjastosta PHP-nimiavaruuteen. Funktio com_print_typeinfo() tulostaa sovitetun vedoksen määritetyn luokan/liittymän tyyppikuvauksesta.
OLE-sovellusliittymä tarjoaa CreateTypeLib-, CreateTypeLib2-, ICreateTypeLib-, ICreateTypeLib2-, ICreateTypeInfo-, ICreateTypeInfo2-rajapinnat, joiden avulla mielivaltaisen tyyppikirjaston luominen ja tallentaminen ratkaistaan ohjelmallisesti. Kehittäjät voivat luoda omia tyyppisiä kirjastosovelluksia käyttämällä näitä API:ita ja rajapintoja.
Tyyppikirjastojen kehittämiseksi Microsoft on luonut erityisen kielen MIDL . Tällä kielellä kirjoitetut lähdetiedostot käännetään käyttämällä samannimistä midl.exe- kääntäjäapuohjelmaa . Aiemmin näihin tarkoituksiin käytettiin mktyplib.exe -tiedostoa , jota pidetään nyt vanhentuneena eikä sitä suositella käytettäväksi. Näiden kahden apuohjelman syöttövaatimusten välillä on merkittävä ero: jokainen koodi, joka on oikea ensimmäiselle, ei ole totta toiselle ja päinvastoin [9] .
Esimerkki IShellDispatch-rajapinnan ilmoittamisesta MIDL:ssä (TLB:stä shell32.dll:stä) [10] [ odl, uuid(D8F015C0 - C278 - 11CE - A49E - 444553540000 ), helpstring( "Liitännän IShellDispatch määritelmä" ), piilotettu, kaksinkertainen, oleautomaatio ] käyttöliittymä IShellDispatch : IDispatch { [id(0x60020000), propget, helpstring( "Hae sovellusobjekti" )] HRESULT Application([out, retval] ID-lähetys ** ppid); [id(0x60020001), propget, helpstring( "Get Parent object" )] HRESULT Parent([out, retval] ID-lähetys ** ppid); [id(0x60020002), helpstring( "Hanki erityinen kansio ShellSpecialFolderConstantsista" )] HRESULT nimiavaruus( [in] VARIANT vDir, [out, retval] Kansio ** ppsdf); [id(0x60020003), helpstring( "Selaa kansion nimiavaruutta" )] HRESULT BrowseForFolder( [in] long Hwnd, [in] BSTR-titteli, [in] pitkiä vaihtoehtoja, [in, valinnainen] VARIANT RootFolder, [out, retval] Kansio ** ppsdf); [id(0x60020004), helpstring( "Avointen kansioikkunoiden kokoelma" )] HRESULT Windows([out, retval] IDispatch ** ppid); [id(0x60020005), helpstring( "Avaa kansio" )] HRESULT Open ([in] VARIANT vDir); [id(0x60020006), helpstring( "Tutki kansiota" )] HRESULT Explore([in] VARIANT vDir); [id(0x60020007), helpstring( "Minimoi kaikki ikkunat" )] HRESULT MinimizeAll(); [id(0x60020008), helpstring( "Undo Minimize All" )] HRESULTUndoMinimizeALL(); [id(0x60020009), helpstring( "Näytä tiedosto ajo" )] HRESULT FileRun(); [id(0x6002000a), helpstring( "Cascade Windows" )] HRESULT CascadeWindows(); [id(0x6002000b), helpstring( "Tile ikkunat pystysuunnassa" )] HRESULT TileVertically(); [id(0x6002000c), helpstring( "Tile ikkunat vaakasuunnassa" )] HRESULT TileHorizontally(); [id(0x6002000d), helpstring( "Poistu Windowsista" )] HRESULT ShutdownWindows(); [id(0x6002000e), helpstring( "Keskeytä tietokone" )] HRESULT Suspend(); [id(0x6002000f), helpstring( "Poista tietokone" )] TULOS EjectPC(); [id(0x60020010), helpstring( "Tuo Aseta aika -valintaikkuna esiin" )] HRESULT SetTime(); [id(0x60020011), helpstring( "Handle Tray properties" )] HRESULT TrayProperties(); [id(0x60020012), helpstring( "Näytä shell ohje" )] HRESULT apua (); [id(0x60020013), helpstring( "Etsi tiedostoja" )] HRESULT FindFiles(); [id(0x60020014), helpstring( "Etsi tietokone" )] HRESULT FindComputer(); [id(0x60020015), helpstring( "Päivitä valikko" )] HRESULT RefreshMenu(); [id(0x60020016), helpstring( "Suorita ohjauspaneelin kohde" )] HRESULT ControlPanelItem([in] BSTR szDir);
Tyyppikirjaston tiedostomuoto tarjoaa mahdollisuuden laajentaa kirjastoon tallennettujen tietojen joukkoa. Jotta kirjastoon voidaan tallentaa joitakin tietoja, joita ei alun perin ollut tarkoitettu, on mahdollista toimittaa mikä tahansa hierarkian elementti (kirjasto, tyyppikuvaus, jäsen) sekä menetelmä-/funktioparametri lohkolla mielivaltaiset tiedot ( englanniksi mukautetut tiedot ).
Microsoft ei määritä mitään muotoa mielivaltaisten tietojen lohkolle - se voi olla mikä tahansa tieto, joka voidaan tallentaa Variant-muuttujaan. Tällä lähestymistavalla on tilanteita, joissa eri kehittäjät käyttävät tätä ominaisuutta eri tarkoituksiin, mikä johtaisi lukuisiin yhteensopivuusongelmiin. Tällaisten törmäysten välttämiseksi, kun tallennat ja vastaanotat mielivaltaisia tietoja, sinun on määritettävä yksilöllinen tunniste (GUID), joka määrittää yksiselitteisesti mielivaltaisen tietolohkon merkityksen ja sen seurauksena sen muodon.
Siten mikä tahansa elementti voidaan varustaa ei yhdellä, vaan useilla mielivaltaisen datan lohkoilla, ja eri ohjelmista voidaan jättää erilaisia lohkoja ja ne palvelevat täysin erilaisia tarkoituksia.
Käytännössä tätä ominaisuutta käyttävät tyyppikirjastot ovat erittäin harvinaisia.
Seuraavia apuohjelmia voidaan käyttää työskennellessäsi tyyppikirjastojen kanssa:
Visual Basic -ympäristössä kehitettäessä tyyppikirjastoja ei usein käytetä aiottuun tarkoitukseen, vaan tavallisten WinAPI - funktioiden varhaiseen [12] tuontiin [13] , ainoana mahdollisena tuontivaihtoehtona VB:ssä tuontitaulukon kautta.
Fragmentti kirjaston lähdekoodista, jota käytetään joidenkin WinAPI-toimintojen tuomiseen ... typedef struct tagCOMBOBOXEXITEMA { ComboBoxExItemMaskFlags maski; int iItem; intpszText; int cchTextMax; int iImage ; int iSelectedImage; int iOverlay; int iIndent; LPARAM lParam; } COMBOBOXEXITEMA, * PCOMBOBOXEXITEMA; [dllname( "comctl32.dll" )] moduleComCtl { [merkintä( "InitCommonControlsEx" )] int InitCommonControlsEx(LPINITCOMMONCONTROLSEX lpInitCtrls); [entry( "ImageList_ReplaceIcon" )] int ImageList_ReplaceIcon(HIMAGELIST himl, int i, HICON hicon); } [dllname( "user32.dll" )] moduuli IconsAPI { [merkintä( "LoadImageW" )] int LoadImage(int vihje, void * lpszName, int uType, int cxDesired, int cyDesired, int fuLoad); } ...