[atl/com] Typelib lezen met ITypeLib

Pagina: 1
Acties:

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
In een applicatie die ik maak heb ik de behoefte om van een willekeurige Type Library de interfaces en hun members te enumereren. Hiervoor gebruik ik ITypeLib en ITypeInfo.
Dit gaat allemaal erg goed. Het enige probleem is dat ik geen onderscheid kan maken tussen members die inherited zijn (van IDispatch en IUnknown bijvoorbeeld) en members die bij de interface zelf horen.
Het enige verschil dat ik zie, is dat de members van IDispatch en IUnknown een erg hoog DISPID hebben.
Moet ik dit 'hardcoden' in m'n proggie of is er een criterium waarmee ik kan zien of een member inherited is of van zichzelf?
Hieronder een stukje source van een testproggie wat ik hiervoor gemaakt heb:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    BSTR      bsName;
    ITypeInfo *pTypeInfo;
    ITypeLib  *pTypeLib;

    LoadTypeLib(L"TestServer.tlb", &pTypeLib);

    mStatus->Lines->Add(IntToStr(pTypeLib->GetTypeInfoCount()));
    pTypeLib->GetDocumentation(-1, &bsName, NULL, NULL, NULL);
    mStatus->Lines->Add(bsName);
    SysFreeString(bsName);

    for (int i=0; i<pTypeLib->GetTypeInfoCount(); i++)
    {
        if (pTypeLib->GetTypeInfo(i, &pTypeInfo) == S_OK)
        {
            pTypeInfo->GetDocumentation(MEMBERID_NIL, &bsName, NULL, NULL, NULL);
            mStatus->Lines->Add(bsName);
            SysFreeString(bsName);

            long     lID;
            FUNCDESC *fd;

            int j=0;
            while (pTypeInfo->GetFuncDesc(j, &fd) == S_OK)
            {
                lID = fd->memid;
                pTypeInfo->GetDocumentation(lID, &bsName, NULL, NULL, NULL);
                mStatus->Lines->Add(bsName);
                mStatus->Lines->Add(IntToStr(fd->memid));
                SysFreeString(bsName);
                j++;
            }
        }
    }

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:21
Ja, mooi dat je ons dat even verteld......

Wat wil je nu bereiken? Gaat er iets mis met dat script? Of wat moeten we ruiken?

https://fgheysels.github.io/


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
whoami schreef op 16 oktober 2002 @ 16:25:
Ja, mooi dat je ons dat even verteld......

Wat wil je nu bereiken? Gaat er iets mis met dat script? Of wat moeten we ruiken?
sorry, ik klikte op 'verstuur bericht' ipv 'bekijk bericht' |:(

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Ik werk er bijna nooit mee maar ik geloof dat je hiermee wel iets kunt:
Vraag eerst de type attributes op:
C++:
1
2
TYPEATTR *ta;
pTypeInfo->GetTypeAttr(&ta);

Als ta->typekind een interface of dispinterface is (TKIND_INTERFACE of TKIND_DISPATCH) geeft ta->cImplTypes het aantal base interfaces van die interface (altijd 0 (bij IUnknown) of 1 (alle anderen), want COM heeft geen multiple inheritance). Met deze code...

C++:
1
2
3
4
HREFTYPE hRefType;
ITypeInfo *pTypeInfo2;
pTypeInfo->GetRefTypeOfImplType(0, &hRefType);
pTypeInfo->GetRefTypeInfo(hRefType, &pTypeInfo2);

... kun je dan de type info van die base class opvragen. Als je dat recursief doet kan je alle base interfaces in ieder geval van elkaar scheiden.
Vergeet niet de TYPEATTR te releasen met ReleaseTypeAttr en natuurlijk alle interfaces.

www.madwizard.org


  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Ik heb ondertussen een makkelijkere manier gevonden:
Je hebt in de structure FUNCDESC een member genaamd wFuncFlags. Als in deze member de vlag FUNCFLAG_FRESTRICTED gezet is, dan weet je dat het een methode is die door typelibrary-browsers niet geshowed wordt.

Citaat uit MSDN (zoeken in index naar 'FUNCFLAGS'):
FUNCFLAG_FRESTRICTED: The function should not be accessible from macro languages. This flag is intended for system-level functions or functions that type browsers should not display.