?? typelib.c
字號:
if (typeInfo) ITypeInfo_Release(typeInfo);
typeInfo = NULL;
}
/* Now, delete the type library path subkey */
get_lcid_subkey( lcid, syskind, subKeyName );
RegDeleteKeyW(key, subKeyName);
*strrchrW( subKeyName, '\\' ) = 0; /* remove last path component */
RegDeleteKeyW(key, subKeyName);
/* check if there is anything besides the FLAGS/HELPDIR keys.
If there is, we don't delete them */
tmpLength = sizeof(subKeyName)/sizeof(WCHAR);
deleteOtherStuff = TRUE;
i = 0;
while(RegEnumKeyExW(key, i++, subKeyName, &tmpLength, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
tmpLength = sizeof(subKeyName)/sizeof(WCHAR);
/* if its not FLAGS or HELPDIR, then we must keep the rest of the key */
if (!strcmpW(subKeyName, FLAGSW)) continue;
if (!strcmpW(subKeyName, HELPDIRW)) continue;
deleteOtherStuff = FALSE;
break;
}
/* only delete the other parts of the key if we're absolutely sure */
if (deleteOtherStuff) {
RegDeleteKeyW(key, FLAGSW);
RegDeleteKeyW(key, HELPDIRW);
RegCloseKey(key);
key = NULL;
RegDeleteKeyW(HKEY_CLASSES_ROOT, keyName);
*strrchrW( keyName, '\\' ) = 0; /* remove last path component */
RegDeleteKeyW(HKEY_CLASSES_ROOT, keyName);
}
end:
if (tlibPath) SysFreeString(tlibPath);
if (typeLib) ITypeLib_Release(typeLib);
if (subKey) RegCloseKey(subKey);
if (key) RegCloseKey(key);
return result;
}
/*======================= ITypeLib implementation =======================*/
typedef struct tagTLBCustData
{
GUID guid;
VARIANT data;
struct tagTLBCustData* next;
} TLBCustData;
/* data structure for import typelibs */
typedef struct tagTLBImpLib
{
int offset; /* offset in the file (MSFT)
offset in nametable (SLTG)
just used to identify library while reading
data from file */
GUID guid; /* libid */
BSTR name; /* name */
LCID lcid; /* lcid of imported typelib */
WORD wVersionMajor; /* major version number */
WORD wVersionMinor; /* minor version number */
struct tagITypeLibImpl *pImpTypeLib; /* pointer to loaded typelib, or
NULL if not yet loaded */
struct tagTLBImpLib * next;
} TLBImpLib;
/* internal ITypeLib data */
typedef struct tagITypeLibImpl
{
const ITypeLib2Vtbl *lpVtbl;
const ITypeCompVtbl *lpVtblTypeComp;
LONG ref;
TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */
/* strings can be stored in tlb as multibyte strings BUT they are *always*
* exported to the application as a UNICODE string.
*/
BSTR Name;
BSTR DocString;
BSTR HelpFile;
BSTR HelpStringDll;
unsigned long dwHelpContext;
int TypeInfoCount; /* nr of typeinfo's in librarry */
struct tagITypeInfoImpl *pTypeInfo; /* linked list of type info data */
int ctCustData; /* number of items in cust data list */
TLBCustData * pCustData; /* linked list to cust data */
TLBImpLib * pImpLibs; /* linked list to all imported typelibs */
int ctTypeDesc; /* number of items in type desc array */
TYPEDESC * pTypeDesc; /* array of TypeDescriptions found in the
library. Only used while reading MSFT
typelibs */
struct list ref_list; /* list of ref types in this typelib */
HREFTYPE dispatch_href; /* reference to IDispatch, -1 if unused */
/* typelibs are cached, keyed by path and index, so store the linked list info within them */
struct tagITypeLibImpl *next, *prev;
WCHAR *path;
INT index;
} ITypeLibImpl;
static const ITypeLib2Vtbl tlbvt;
static const ITypeCompVtbl tlbtcvt;
static inline ITypeLibImpl *impl_from_ITypeComp( ITypeComp *iface )
{
return (ITypeLibImpl *)((char*)iface - FIELD_OFFSET(ITypeLibImpl, lpVtblTypeComp));
}
/* ITypeLib methods */
static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength);
static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength);
/*======================= ITypeInfo implementation =======================*/
/* data for referenced types */
typedef struct tagTLBRefType
{
INT index; /* Type index for internal ref or for external ref
it the format is SLTG. -2 indicates to
use guid */
GUID guid; /* guid of the referenced type */
/* if index == TLB_REF_USE_GUID */
HREFTYPE reference; /* The href of this ref */
TLBImpLib *pImpTLInfo; /* If ref is external ptr to library data
TLB_REF_INTERNAL for internal refs
TLB_REF_NOT_FOUND for broken refs */
struct list entry;
} TLBRefType;
#define TLB_REF_USE_GUID -2
#define TLB_REF_INTERNAL (void*)-2
#define TLB_REF_NOT_FOUND (void*)-1
/* internal Parameter data */
typedef struct tagTLBParDesc
{
BSTR Name;
int ctCustData;
TLBCustData * pCustData; /* linked list to cust data */
} TLBParDesc;
/* internal Function data */
typedef struct tagTLBFuncDesc
{
FUNCDESC funcdesc; /* lots of info on the function and its attributes. */
BSTR Name; /* the name of this function */
TLBParDesc *pParamDesc; /* array with param names and custom data */
int helpcontext;
int HelpStringContext;
BSTR HelpString;
BSTR Entry; /* if its Hiword==0, it numeric; -1 is not present*/
int ctCustData;
TLBCustData * pCustData; /* linked list to cust data; */
struct tagTLBFuncDesc * next;
} TLBFuncDesc;
/* internal Variable data */
typedef struct tagTLBVarDesc
{
VARDESC vardesc; /* lots of info on the variable and its attributes. */
BSTR Name; /* the name of this variable */
int HelpContext;
int HelpStringContext; /* FIXME: where? */
BSTR HelpString;
int ctCustData;
TLBCustData * pCustData;/* linked list to cust data; */
struct tagTLBVarDesc * next;
} TLBVarDesc;
/* internal implemented interface data */
typedef struct tagTLBImplType
{
HREFTYPE hRef; /* hRef of interface */
int implflags; /* IMPLFLAG_*s */
int ctCustData;
TLBCustData * pCustData;/* linked list to custom data; */
struct tagTLBImplType *next;
} TLBImplType;
/* internal TypeInfo data */
typedef struct tagITypeInfoImpl
{
const ITypeInfo2Vtbl *lpVtbl;
const ITypeCompVtbl *lpVtblTypeComp;
LONG ref;
BOOL no_free_data; /* don't free data structurees */
TYPEATTR TypeAttr ; /* _lots_ of type information. */
ITypeLibImpl * pTypeLib; /* back pointer to typelib */
int index; /* index in this typelib; */
HREFTYPE hreftype; /* hreftype for app object binding */
/* type libs seem to store the doc strings in ascii
* so why should we do it in unicode?
*/
BSTR Name;
BSTR DocString;
BSTR DllName;
unsigned long dwHelpContext;
unsigned long dwHelpStringContext;
/* functions */
TLBFuncDesc * funclist; /* linked list with function descriptions */
/* variables */
TLBVarDesc * varlist; /* linked list with variable descriptions */
/* Implemented Interfaces */
TLBImplType * impltypelist;
int ctCustData;
TLBCustData * pCustData; /* linked list to cust data; */
struct tagITypeInfoImpl * next;
} ITypeInfoImpl;
static inline ITypeInfoImpl *info_impl_from_ITypeComp( ITypeComp *iface )
{
return (ITypeInfoImpl *)((char*)iface - FIELD_OFFSET(ITypeInfoImpl, lpVtblTypeComp));
}
static const ITypeInfo2Vtbl tinfvt;
static const ITypeCompVtbl tcompvt;
static ITypeInfo2 * WINAPI ITypeInfo_Constructor(void);
typedef struct tagTLBContext
{
unsigned int oStart; /* start of TLB in file */
unsigned int pos; /* current pos */
unsigned int length; /* total length */
void *mapping; /* memory mapping */
MSFT_SegDir * pTblDir;
ITypeLibImpl* pLibInfo;
} TLBContext;
static void MSFT_DoRefType(TLBContext *pcx, ITypeLibImpl *pTL, int offset);
/*
debug
*/
static void dump_TypeDesc(const TYPEDESC *pTD,char *szVarType) {
if (pTD->vt & VT_RESERVED)
szVarType += strlen(strcpy(szVarType, "reserved | "));
if (pTD->vt & VT_BYREF)
szVarType += strlen(strcpy(szVarType, "ref to "));
if (pTD->vt & VT_ARRAY)
szVarType += strlen(strcpy(szVarType, "array of "));
if (pTD->vt & VT_VECTOR)
szVarType += strlen(strcpy(szVarType, "vector of "));
switch(pTD->vt & VT_TYPEMASK) {
case VT_UI1: sprintf(szVarType, "VT_UI1"); break;
case VT_I2: sprintf(szVarType, "VT_I2"); break;
case VT_I4: sprintf(szVarType, "VT_I4"); break;
case VT_R4: sprintf(szVarType, "VT_R4"); break;
case VT_R8: sprintf(szVarType, "VT_R8"); break;
case VT_BOOL: sprintf(szVarType, "VT_BOOL"); break;
case VT_ERROR: sprintf(szVarType, "VT_ERROR"); break;
case VT_CY: sprintf(szVarType, "VT_CY"); break;
case VT_DATE: sprintf(szVarType, "VT_DATE"); break;
case VT_BSTR: sprintf(szVarType, "VT_BSTR"); break;
case VT_UNKNOWN: sprintf(szVarType, "VT_UNKNOWN"); break;
case VT_DISPATCH: sprintf(szVarType, "VT_DISPATCH"); break;
case VT_I1: sprintf(szVarType, "VT_I1"); break;
case VT_UI2: sprintf(szVarType, "VT_UI2"); break;
case VT_UI4: sprintf(szVarType, "VT_UI4"); break;
case VT_INT: sprintf(szVarType, "VT_INT"); break;
case VT_UINT: sprintf(szVarType, "VT_UINT"); break;
case VT_VARIANT: sprintf(szVarType, "VT_VARIANT"); break;
case VT_VOID: sprintf(szVarType, "VT_VOID"); break;
case VT_HRESULT: sprintf(szVarType, "VT_HRESULT"); break;
case VT_USERDEFINED: sprintf(szVarType, "VT_USERDEFINED ref = %x",
pTD->u.hreftype); break;
case VT_PTR: sprintf(szVarType, "ptr to ");
dump_TypeDesc(pTD->u.lptdesc, szVarType + 7);
break;
case VT_SAFEARRAY: sprintf(szVarType, "safearray of ");
dump_TypeDesc(pTD->u.lptdesc, szVarType + 13);
break;
case VT_CARRAY: sprintf(szVarType, "%d dim array of ",
pTD->u.lpadesc->cDims); /* FIXME print out sizes */
dump_TypeDesc(&pTD->u.lpadesc->tdescElem, szVarType + strlen(szVarType));
break;
default: sprintf(szVarType, "unknown(%d)", pTD->vt & VT_TYPEMASK); break;
}
}
static void dump_ELEMDESC(const ELEMDESC *edesc) {
char buf[200];
USHORT flags = edesc->u.paramdesc.wParamFlags;
dump_TypeDesc(&edesc->tdesc,buf);
MESSAGE("\t\ttdesc.vartype %d (%s)\n",edesc->tdesc.vt,buf);
MESSAGE("\t\tu.paramdesc.wParamFlags");
if (!flags) MESSAGE(" PARAMFLAGS_NONE");
if (flags & PARAMFLAG_FIN) MESSAGE(" PARAMFLAG_FIN");
if (flags & PARAMFLAG_FOUT) MESSAGE(" PARAMFLAG_FOUT");
if (flags & PARAMFLAG_FLCID) MESSAGE(" PARAMFLAG_FLCID");
if (flags & PARAMFLAG_FRETVAL) MESSAGE(" PARAMFLAG_FRETVAL");
if (flags & PARAMFLAG_FOPT) MESSAGE(" PARAMFLAG_FOPT");
if (flags & PARAMFLAG_FHASDEFAULT) MESSAGE(" PARAMFLAG_FHASDEFAULT");
if (flags & PARAMFLAG_FHASCUSTDATA) MESSAGE(" PARAMFLAG_FHASCUSTDATA");
MESSAGE("\n\t\tu.paramdesc.lpex %p\n",edesc->u.paramdesc.pparamdescex);
}
static void dump_FUNCDESC(const FUNCDESC *funcdesc) {
int i;
MESSAGE("memid is %08x\n",funcdesc->memid);
for (i=0;i<funcdesc->cParams;i++) {
MESSAGE("Param %d:\n",i);
dump_ELEMDESC(funcdesc->lprgelemdescParam+i);
}
MESSAGE("\tfunckind: %d (",funcdesc->funckind);
switch (funcdesc->funckind) {
case FUNC_VIRTUAL: MESSAGE("virtual");break;
case FUNC_PUREVIRTUAL: MESSAGE("pure virtual");break;
case FUNC_NONVIRTUAL: MESSAGE("nonvirtual");break;
case FUNC_STATIC: MESSAGE("static");break;
case FUNC_DISPATCH: MESSAGE("dispatch");break;
default: MESSAGE("unknown");break;
}
MESSAGE(")\n\tinvkind: %d (",funcdesc->invkind);
switch (funcdesc->invkind) {
case INVOKE_FUNC: MESSAGE("func");break;
case INVOKE_PROPERTYGET: MESSAGE("property get");break;
case INVOKE_PROPERTYPUT: MESSAGE("property put");break;
case INVOKE_PROPERTYPUTREF: MESSAGE("property put ref");break;
}
MESSAGE(")\n\tcallconv: %d (",funcdesc->callconv);
switch (funcdesc->callconv) {
case CC_CDECL: MESSAGE("cdecl");break;
case CC_PASCAL: MESSAGE("pascal");break;
case CC_STDCALL: MESSAGE("stdcall");break;
case CC_SYSCALL: MESSAGE("syscall");break;
default:break;
}
MESSAGE(")\n\toVft: %d\n", funcdesc->oVft);
MESSAGE("\tcParamsOpt: %d\n", funcdesc->cParamsOpt);
MESSAGE("\twFlags: %x\n", funcdesc->wFuncFlags);
MESSAGE("\telemdescFunc (return value type):\n");
dump_ELEMDESC(&funcdesc->elemdescFunc);
}
static const char * const typekind_desc[] =
{
"TKIND_ENUM",
"TKIND_RECORD",
"TKIND_MODULE",
"TKIND_INTERFACE",
"TKIND_DISPATCH",
"TKIND_COCLASS",
"TKIND_ALIAS",
"TKIND_UNION",
"TKIND_MAX"
};
static void dump_TLBFuncDescOne(const TLBFuncDesc * pfd)
{
int i;
MESSAGE("%s(%u)\n", debugstr_w(pfd->Name), pfd->funcdesc.cParams);
for (i=0;i<pfd->funcdesc.cParams;i++)
MESSAGE("\tparm%d: %s\n",i,debugstr_w(pfd->pParamDesc[i].Name));
dump_FUNCDESC(&(pfd->funcdesc));
MESSAGE("\thelpstring: %s\n", debugstr_w(pfd->HelpString));
MESSAGE("\tentry: %s\n", (pfd->Entry == (void *)-1) ? "invalid" : debugstr_w(pfd->Entry));
}
static void dump_TLBFuncDesc(const TLBFuncDesc * pfd)
{
while (pfd)
{
dump_TLBFuncDescOne(pfd);
pfd = pfd->next;
};
}
static void dump_TLBVarDesc(const TLBVarDesc * pvd)
{
while (pvd)
{
TRACE_(typelib)("%s\n", debugstr_w(pvd->Name));
pvd = pvd->next;
};
}
static void dump_TLBImpLib(const TLBImpLib *import)
{
TRACE_(typelib)("%s %s\n", debugstr_guid(&(import->guid)),
debugstr_w(import->name));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -