?? typelib.c
字號:
TRACE_(typelib)("v%d.%d lcid=%x offset=%x\n", import->wVersionMajor,
import->wVersionMinor, import->lcid, import->offset);
}
static void dump_TLBRefType(const ITypeLibImpl *pTL)
{
TLBRefType *ref;
LIST_FOR_EACH_ENTRY(ref, &pTL->ref_list, TLBRefType, entry)
{
TRACE_(typelib)("href:0x%08x\n", ref->reference);
if(ref->index == -1)
TRACE_(typelib)("%s\n", debugstr_guid(&(ref->guid)));
else
TRACE_(typelib)("type no: %d\n", ref->index);
if(ref->pImpTLInfo != TLB_REF_INTERNAL && ref->pImpTLInfo != TLB_REF_NOT_FOUND)
{
TRACE_(typelib)("in lib\n");
dump_TLBImpLib(ref->pImpTLInfo);
}
}
}
static void dump_TLBImplType(const TLBImplType * impl)
{
while (impl) {
TRACE_(typelib)(
"implementing/inheriting interface hRef = %x implflags %x\n",
impl->hRef, impl->implflags);
impl = impl->next;
}
}
static void dump_Variant(const VARIANT * pvar)
{
SYSTEMTIME st;
TRACE("%p->{%s%s", pvar, debugstr_VT(pvar), debugstr_VF(pvar));
if (pvar)
{
if (V_ISBYREF(pvar) || V_TYPE(pvar) == VT_UNKNOWN ||
V_TYPE(pvar) == VT_DISPATCH || V_TYPE(pvar) == VT_RECORD)
{
TRACE(",%p", V_BYREF(pvar));
}
else if (V_ISARRAY(pvar) || V_ISVECTOR(pvar))
{
TRACE(",%p", V_ARRAY(pvar));
}
else switch (V_TYPE(pvar))
{
case VT_I1: TRACE(",%d", V_I1(pvar)); break;
case VT_UI1: TRACE(",%d", V_UI1(pvar)); break;
case VT_I2: TRACE(",%d", V_I2(pvar)); break;
case VT_UI2: TRACE(",%d", V_UI2(pvar)); break;
case VT_INT:
case VT_I4: TRACE(",%d", V_I4(pvar)); break;
case VT_UINT:
case VT_UI4: TRACE(",%d", V_UI4(pvar)); break;
case VT_I8: TRACE(",0x%08x,0x%08x", (ULONG)(V_I8(pvar) >> 32),
(ULONG)(V_I8(pvar) & 0xffffffff)); break;
case VT_UI8: TRACE(",0x%08x,0x%08x", (ULONG)(V_UI8(pvar) >> 32),
(ULONG)(V_UI8(pvar) & 0xffffffff)); break;
case VT_R4: TRACE(",%3.3e", V_R4(pvar)); break;
case VT_R8: TRACE(",%3.3e", V_R8(pvar)); break;
case VT_BOOL: TRACE(",%s", V_BOOL(pvar) ? "TRUE" : "FALSE"); break;
case VT_BSTR: TRACE(",%s", debugstr_w(V_BSTR(pvar))); break;
case VT_CY: TRACE(",0x%08x,0x%08x", V_CY(pvar).s.Hi,
V_CY(pvar).s.Lo); break;
case VT_DATE:
if(!VariantTimeToSystemTime(V_DATE(pvar), &st))
TRACE(",<invalid>");
else
TRACE(",%04d/%02d/%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);
break;
case VT_ERROR:
case VT_VOID:
case VT_USERDEFINED:
case VT_EMPTY:
case VT_NULL: break;
default: TRACE(",?"); break;
}
}
TRACE("}\n");
}
static void dump_DispParms(const DISPPARAMS * pdp)
{
int index;
TRACE("args=%u named args=%u\n", pdp->cArgs, pdp->cNamedArgs);
if (pdp->cNamedArgs && pdp->rgdispidNamedArgs)
{
TRACE("named args:\n");
for (index = 0; index < pdp->cNamedArgs; index++)
TRACE( "\t0x%x\n", pdp->rgdispidNamedArgs[index] );
}
if (pdp->cArgs && pdp->rgvarg)
{
TRACE("args:\n");
for (index = 0; index < pdp->cArgs; index++)
dump_Variant( &pdp->rgvarg[index] );
}
}
static void dump_TypeInfo(const ITypeInfoImpl * pty)
{
TRACE("%p ref=%u\n", pty, pty->ref);
TRACE("%s %s\n", debugstr_w(pty->Name), debugstr_w(pty->DocString));
TRACE("attr:%s\n", debugstr_guid(&(pty->TypeAttr.guid)));
TRACE("kind:%s\n", typekind_desc[pty->TypeAttr.typekind]);
TRACE("fct:%u var:%u impl:%u\n",
pty->TypeAttr.cFuncs, pty->TypeAttr.cVars, pty->TypeAttr.cImplTypes);
TRACE("wTypeFlags: 0x%04x\n", pty->TypeAttr.wTypeFlags);
TRACE("parent tlb:%p index in TLB:%u\n",pty->pTypeLib, pty->index);
if (pty->TypeAttr.typekind == TKIND_MODULE) TRACE("dllname:%s\n", debugstr_w(pty->DllName));
if (TRACE_ON(ole))
dump_TLBFuncDesc(pty->funclist);
dump_TLBVarDesc(pty->varlist);
dump_TLBImplType(pty->impltypelist);
}
static void dump_VARDESC(const VARDESC *v)
{
MESSAGE("memid %d\n",v->memid);
MESSAGE("lpstrSchema %s\n",debugstr_w(v->lpstrSchema));
MESSAGE("oInst %d\n",v->u.oInst);
dump_ELEMDESC(&(v->elemdescVar));
MESSAGE("wVarFlags %x\n",v->wVarFlags);
MESSAGE("varkind %d\n",v->varkind);
}
static TYPEDESC stndTypeDesc[VT_LPWSTR+1]=
{
/* VT_LPWSTR is largest type that */
/* may appear in type description*/
{{0}, 0},{{0}, 1},{{0}, 2},{{0}, 3},{{0}, 4},
{{0}, 5},{{0}, 6},{{0}, 7},{{0}, 8},{{0}, 9},
{{0},10},{{0},11},{{0},12},{{0},13},{{0},14},
{{0},15},{{0},16},{{0},17},{{0},18},{{0},19},
{{0},20},{{0},21},{{0},22},{{0},23},{{0},24},
{{0},25},{{0},26},{{0},27},{{0},28},{{0},29},
{{0},30},{{0},31}
};
static void TLB_abort(void)
{
DebugBreak();
}
static void * TLB_Alloc(unsigned size)
{
void * ret;
if((ret=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size))==NULL){
/* FIXME */
ERR("cannot allocate memory\n");
}
return ret;
}
static void TLB_Free(void * ptr)
{
HeapFree(GetProcessHeap(), 0, ptr);
}
/* returns the size required for a deep copy of a typedesc into a
* flat buffer */
static SIZE_T TLB_SizeTypeDesc( const TYPEDESC *tdesc, BOOL alloc_initial_space )
{
SIZE_T size = 0;
if (alloc_initial_space)
size += sizeof(TYPEDESC);
switch (tdesc->vt)
{
case VT_PTR:
case VT_SAFEARRAY:
size += TLB_SizeTypeDesc(tdesc->u.lptdesc, TRUE);
break;
case VT_CARRAY:
size += FIELD_OFFSET(ARRAYDESC, rgbounds[tdesc->u.lpadesc->cDims]);
size += TLB_SizeTypeDesc(&tdesc->u.lpadesc->tdescElem, FALSE);
break;
}
return size;
}
/* deep copy a typedesc into a flat buffer */
static void *TLB_CopyTypeDesc( TYPEDESC *dest, const TYPEDESC *src, void *buffer )
{
if (!dest)
{
dest = buffer;
buffer = (char *)buffer + sizeof(TYPEDESC);
}
*dest = *src;
switch (src->vt)
{
case VT_PTR:
case VT_SAFEARRAY:
dest->u.lptdesc = buffer;
buffer = TLB_CopyTypeDesc(NULL, src->u.lptdesc, buffer);
break;
case VT_CARRAY:
dest->u.lpadesc = buffer;
memcpy(dest->u.lpadesc, src->u.lpadesc, FIELD_OFFSET(ARRAYDESC, rgbounds[src->u.lpadesc->cDims]));
buffer = (char *)buffer + FIELD_OFFSET(ARRAYDESC, rgbounds[src->u.lpadesc->cDims]);
buffer = TLB_CopyTypeDesc(&dest->u.lpadesc->tdescElem, &src->u.lpadesc->tdescElem, buffer);
break;
}
return buffer;
}
/**********************************************************************
*
* Functions for reading MSFT typelibs (those created by CreateTypeLib2)
*/
static inline unsigned int MSFT_Tell(TLBContext *pcx)
{
return pcx->pos;
}
static inline void MSFT_Seek(TLBContext *pcx, long where)
{
if (where != DO_NOT_SEEK)
{
where += pcx->oStart;
if (where > pcx->length)
{
/* FIXME */
ERR("seek beyond end (%ld/%d)\n", where, pcx->length );
TLB_abort();
}
pcx->pos = where;
}
}
/* read function */
static DWORD MSFT_Read(void *buffer, DWORD count, TLBContext *pcx, long where )
{
TRACE_(typelib)("pos=0x%08x len=0x%08x 0x%08x 0x%08x 0x%08lx\n",
pcx->pos, count, pcx->oStart, pcx->length, where);
MSFT_Seek(pcx, where);
if (pcx->pos + count > pcx->length) count = pcx->length - pcx->pos;
memcpy( buffer, (char *)pcx->mapping + pcx->pos, count );
pcx->pos += count;
return count;
}
static DWORD MSFT_ReadLEDWords(void *buffer, DWORD count, TLBContext *pcx,
long where )
{
DWORD ret;
ret = MSFT_Read(buffer, count, pcx, where);
FromLEDWords(buffer, ret);
return ret;
}
static DWORD MSFT_ReadLEWords(void *buffer, DWORD count, TLBContext *pcx,
long where )
{
DWORD ret;
ret = MSFT_Read(buffer, count, pcx, where);
FromLEWords(buffer, ret);
return ret;
}
static void MSFT_ReadGuid( GUID *pGuid, int offset, TLBContext *pcx)
{
if(offset<0 || pcx->pTblDir->pGuidTab.offset <0){
memset(pGuid,0, sizeof(GUID));
return;
}
MSFT_Read(pGuid, sizeof(GUID), pcx, pcx->pTblDir->pGuidTab.offset+offset );
pGuid->Data1 = FromLEDWord(pGuid->Data1);
pGuid->Data2 = FromLEWord(pGuid->Data2);
pGuid->Data3 = FromLEWord(pGuid->Data3);
TRACE_(typelib)("%s\n", debugstr_guid(pGuid));
}
static HREFTYPE MSFT_ReadHreftype( TLBContext *pcx, int offset )
{
MSFT_NameIntro niName;
if (offset < 0)
{
ERR_(typelib)("bad offset %d\n", offset);
return -1;
}
MSFT_ReadLEDWords(&niName, sizeof(niName), pcx,
pcx->pTblDir->pNametab.offset+offset);
return niName.hreftype;
}
static BSTR MSFT_ReadName( TLBContext *pcx, int offset)
{
char * name;
MSFT_NameIntro niName;
int lengthInChars;
BSTR bstrName = NULL;
if (offset < 0)
{
ERR_(typelib)("bad offset %d\n", offset);
return NULL;
}
MSFT_ReadLEDWords(&niName, sizeof(niName), pcx,
pcx->pTblDir->pNametab.offset+offset);
niName.namelen &= 0xFF; /* FIXME: correct ? */
name=TLB_Alloc((niName.namelen & 0xff) +1);
MSFT_Read(name, (niName.namelen & 0xff), pcx, DO_NOT_SEEK);
name[niName.namelen & 0xff]='\0';
lengthInChars = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS,
name, -1, NULL, 0);
/* no invalid characters in string */
if (lengthInChars)
{
bstrName = SysAllocStringByteLen(NULL, lengthInChars * sizeof(WCHAR));
/* don't check for invalid character since this has been done previously */
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, bstrName, lengthInChars);
}
TLB_Free(name);
TRACE_(typelib)("%s %d\n", debugstr_w(bstrName), lengthInChars);
return bstrName;
}
static BSTR MSFT_ReadString( TLBContext *pcx, int offset)
{
char * string;
INT16 length;
int lengthInChars;
BSTR bstr = NULL;
if(offset<0) return NULL;
MSFT_ReadLEWords(&length, sizeof(INT16), pcx, pcx->pTblDir->pStringtab.offset+offset);
if(length <= 0) return 0;
string=TLB_Alloc(length +1);
MSFT_Read(string, length, pcx, DO_NOT_SEEK);
string[length]='\0';
lengthInChars = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS,
string, -1, NULL, 0);
/* no invalid characters in string */
if (lengthInChars)
{
bstr = SysAllocStringByteLen(NULL, lengthInChars * sizeof(WCHAR));
/* don't check for invalid character since this has been done previously */
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, string, -1, bstr, lengthInChars);
}
TLB_Free(string);
TRACE_(typelib)("%s %d\n", debugstr_w(bstr), lengthInChars);
return bstr;
}
/*
* read a value and fill a VARIANT structure
*/
static void MSFT_ReadValue( VARIANT * pVar, int offset, TLBContext *pcx )
{
int size;
TRACE_(typelib)("\n");
if(offset <0) { /* data are packed in here */
V_VT(pVar) = (offset & 0x7c000000 )>> 26;
V_I4(pVar) = offset & 0x3ffffff;
return;
}
MSFT_ReadLEWords(&(V_VT(pVar)), sizeof(VARTYPE), pcx,
pcx->pTblDir->pCustData.offset + offset );
TRACE_(typelib)("Vartype = %x\n", V_VT(pVar));
switch (V_VT(pVar)){
case VT_EMPTY: /* FIXME: is this right? */
case VT_NULL: /* FIXME: is this right? */
case VT_I2 : /* this should not happen */
case VT_I4 :
case VT_R4 :
case VT_ERROR :
case VT_BOOL :
case VT_I1 :
case VT_UI1 :
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -