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:
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++; } } } |