Tyyppikirjasto

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 .

Luomisen syyt

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.

Looginen rakenne

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

Merkitys

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 .

Käyttö

Ohjelmisto

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.

Ohjelmointikielet ja kehitysympäristöt

Microsoft Visual Basic

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++ Builder

Nä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ä.

PHP

PHP: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.

Luominen

Ohjelmisto

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.

Manuaalinen

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);


Laajennettavuus

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.


Muut

Apuohjelmat

Seuraavia apuohjelmia voidaan käyttää työskennellessäsi tyyppikirjastojen kanssa:

  • MIDL (cons.)
    MIDL-kielen kääntäjä, luo TLB-tiedoston lähdekoodin perusteella.
  • MkTypLib (cons.)
    Vanhentunut ja vanhentunut kääntäjä TLB-tiedostojen luomiseen. Syöttötiedostojen syntaksi on erilainen kuin MIDL:n. Jos haluat kääntää "vanhaan tyyliin" kirjoitettuja lähteitä, on suositeltavaa käyttää MIDL: ää valitsimella /mktyplib203 [11] .
  • regtlib (cons.)
    Apuohjelma tyyppikirjastojen rekisteröimiseksi rekisteriin .
  • regsvr32 (windows)
    Apuohjelma ActiveX-palvelimien rekisteröimiseksi rekisteriin. Rekisteröinnin yhteydessä myös ActiveX-palvelimen resursseihin tallennettu TLB rekisteröidään yleensä epäsuorasti.
  • Microsoft OLE View (ikkuna)
    Apuohjelma, joka näyttää luettelon kaikista järjestelmään rekisteröidyistä tyyppikirjastoista, jolloin voit tarkastella myös niiden sisältöä. Pystyy palauttamaan katsotun elementin (koko kirjaston/konekirjoituksen/jäsenen) lähdekoodin. Toimitetaan Microsoft Visual Studio 6.0 :n kanssa .
  • Visual Basicin objektiselain ei ole muuta kuin selain projektiin yhdistetyille tyyppikirjastoille . 

Väärinkäyttö

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); } ...

Muistiinpanot

  1. Joka puolestaan ​​on PE-tiedosto ja jonka tunniste on ".dll", ".ocx", ".cpl", ".exe" jne.
  2. C / C ++ -terminologian mukaan  - rakenne (struct), Pascal -terminologian mukaan  - tietue (tietue), Visual Basic -terminologian mukaan - käyttäjän määrittelemä tyyppi (User-Defined Type, UDT).
  3. IDispatchista johdettu COM-liitäntä, joka tukee myöhäistä sidontaa IDispatch::Invoken avulla.
  4. Latauksen suorittaa OLE Automation, ei kehittäjä.
  5. Koska se tallentaa paljon hyödyllisempää tietoa, se on kompaktimpi ja nopeampi (ei tarvitse jäsentää) otsikkotiedostoja ja mikä tärkeintä, sitä voidaan käyttää missä tahansa kehitysympäristössä ja missä tahansa ohjelmointikielessä, jota COM tukee, ei vain C / C ++.
  6. LoadTypeLib arkistoitu 21. heinäkuuta 2009 Wayback Machinessa ja LoadTypeLibEx arkistoitu 4. helmikuuta 2011 Wayback Machinessa
  7. Rajoituksena on mahdottomuus määrittää IID/CLSID ilmoitetulle rajapinnalle/luokalle - tunniste määräytyy automaattisesti, mikä tekee ilmoitetuista entiteeteista pohjimmiltaan yhteensopimattomia olemassa olevien kanssa.
  8. No_namespace -muunnin estää tämän toiminnan . Katso lisätietoja MSDN :stä. Arkistoitu 11. helmikuuta 2010 Wayback Machinessa
  9. Erot MIDL:n ja MkTypLibin välillä Arkistoitu 27. toukokuuta 2010 Wayback Machinelle (MSDN).
  10. Koodi saatiin Microsoft OLE/COM Object Viewer -apuohjelman suorittaman TLB :n purkamisen tuloksena.
  11. Avaimen kuvaus /mktyplib203 Arkistoitu 19. kesäkuuta 2010 Wayback Machinessa (MSDN).
  12. Toisin kuin myöhemmässä, Declare Sub/Function -toiminnon avulla.
  13. Yleensä niillä ei ole mitään tekemistä COM:n ja lisäksi OLE Automationin kanssa.