- Timestamp:
- Feb 16, 2002, 5:55:23 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/oleaut32/typelib.c
r7508 r7934 54 54 #include "winnls.h" /* for PRIMARYLANGID */ 55 55 #include "winreg.h" /* for HKEY_LOCAL_MACHINE */ 56 #include "winuser.h" 56 57 57 58 #include "wine/unicode.h" … … 68 69 #ifdef __WIN32OS2__ 69 70 #include <neexe.h> 70 #endif 71 72 #ifndef __WIN32OS2__ 71 #else 73 72 /**************************************************************************** 74 73 * QueryPathOfRegTypeLib [TYPELIB.14] … … 114 113 return S_OK; 115 114 } 116 #endif 115 #endif 116 117 117 /**************************************************************************** 118 118 * QueryPathOfRegTypeLib [OLEAUT32.164] … … 143 143 char szPath[dwPathLen]; 144 144 #endif 145 146 145 if ( !HIWORD(guid) ) 147 146 { … … 219 218 return E_FAIL; 220 219 } 221 #ifndef __WIN32OS2__222 220 /****************************************************************************** 223 221 * LoadTypeLib [TYPELIB.3] Loads and registers a type library … … 241 239 return E_FAIL; 242 240 } 243 #endif 241 244 242 /****************************************************************************** 245 243 * LoadTypeLib [OLEAUT32.161] … … 277 275 { 278 276 WCHAR szPath[MAX_PATH+1], szFileCopy[MAX_PATH+1]; 279 const WCHAR *pFile,*pIndexStr;277 WCHAR *pIndexStr; 280 278 HRESULT res; 281 279 INT index = 1; 282 280 TRACE("(%s,%d,%p)\n",debugstr_w(szFile), regkind, pptLib); 283 281 284 pFile = szFile;285 282 if(!SearchPathW(NULL,szFile,NULL,sizeof(szPath)/sizeof(WCHAR),szPath, 286 283 NULL)) { … … 293 290 (pIndexStr - szFile - 1) * sizeof(WCHAR)); 294 291 szFileCopy[pIndexStr - szFile - 1] = '\0'; 295 pFile = szFileCopy;296 292 if(!SearchPathW(NULL,szFileCopy,NULL,sizeof(szPath)/sizeof(WCHAR), 297 293 szPath,NULL)) 298 294 return TYPE_E_CANTLOADLIBRARY; 295 if (GetFileAttributesW(szFileCopy) & FILE_ATTRIBUTE_DIRECTORY) 296 return TYPE_E_CANTLOADLIBRARY; 299 297 } else 300 298 return TYPE_E_CANTLOADLIBRARY; 301 299 } 302 300 303 TRACE("File %s index %d\n", debugstr_w( pFile), index);304 305 res = TLB_ReadTypeLib( pFile, index, (ITypeLib2**)pptLib);301 TRACE("File %s index %d\n", debugstr_w(szPath), index); 302 303 res = TLB_ReadTypeLib(szPath, index, (ITypeLib2**)pptLib); 306 304 307 305 if (SUCCEEDED(res)) … … 704 702 BSTR Name; /* the name of this variable */ 705 703 int HelpContext; 706 int HelpStringContext; /* fixme: where? */704 int HelpStringContext; /* FIXME: where? */ 707 705 BSTR HelpString; 708 706 int ctCustData; … … 769 767 static void MSFT_DoRefType(TLBContext *pcx, ITypeInfoImpl *pTI, int offset); 770 768 771 //#define TYPELIBDEBUG 772 #if defined(__WIN32OS2__) && defined(TYPELIBDEBUG) 773 769 #if defined(__WIN32OS2__) && defined(DEBUG) 774 770 /* 775 771 debug … … 779 775 * of the variant 780 776 */ 781 switch(vt) { 777 if (vt & VT_RESERVED) 778 szVarType += strlen(strcpy(szVarType, "reserved | ")); 779 if (vt & VT_BYREF) 780 szVarType += strlen(strcpy(szVarType, "ref to ")); 781 if (vt & VT_ARRAY) 782 szVarType += strlen(strcpy(szVarType, "array of ")); 783 if (vt & VT_VECTOR) 784 szVarType += strlen(strcpy(szVarType, "vector of ")); 785 switch(vt & VT_TYPEMASK) { 782 786 case VT_UI1: sprintf(szVarType, "VT_UI"); break; 783 787 case VT_I2: sprintf(szVarType, "VT_I2"); break; … … 790 794 case VT_DATE: sprintf(szVarType, "VT_DATE"); break; 791 795 case VT_BSTR: sprintf(szVarType, "VT_BSTR"); break; 792 case VT_ BYREF: case VT_UNKNOWN: sprintf(szVarType, "VT_BYREF"); break;796 case VT_UNKNOWN: sprintf(szVarType, "VT_UNKNOWN"); break; 793 797 case VT_DISPATCH: sprintf(szVarType, "VT_DISPATCH"); break; 794 case VT_ARRAY: sprintf(szVarType, "VT_ARRAY"); break;795 798 case VT_I1: sprintf(szVarType, "VT_I1"); break; 796 799 case VT_UI2: sprintf(szVarType, "VT_UI2"); break; … … 798 801 case VT_INT: sprintf(szVarType, "VT_INT"); break; 799 802 case VT_UINT: sprintf(szVarType, "VT_UINT"); break; 803 case VT_VARIANT: sprintf(szVarType, "VT_VARIANT"); break; 804 case VT_VOID: sprintf(szVarType, "VT_VOID"); break; 800 805 case VT_USERDEFINED: sprintf(szVarType, "VT_USERDEFINED\n"); break; 801 default: sprintf(szVarType, "unknown ");break;806 default: sprintf(szVarType, "unknown(%d)", vt & VT_TYPEMASK); break; 802 807 } 803 808 } 804 809 805 810 static void dump_TypeDesc(TYPEDESC *pTD,char *szVarType) { 806 switch(pTD->vt) { 811 if (pTD->vt & VT_RESERVED) 812 szVarType += strlen(strcpy(szVarType, "reserved | ")); 813 if (pTD->vt & VT_BYREF) 814 szVarType += strlen(strcpy(szVarType, "ref to ")); 815 if (pTD->vt & VT_ARRAY) 816 szVarType += strlen(strcpy(szVarType, "array of ")); 817 if (pTD->vt & VT_VECTOR) 818 szVarType += strlen(strcpy(szVarType, "vector of ")); 819 switch(pTD->vt & VT_TYPEMASK) { 807 820 case VT_UI1: sprintf(szVarType, "VT_UI1"); break; 808 821 case VT_I2: sprintf(szVarType, "VT_I2"); break; … … 815 828 case VT_DATE: sprintf(szVarType, "VT_DATE"); break; 816 829 case VT_BSTR: sprintf(szVarType, "VT_BSTR"); break; 817 case VT_ BYREF: case VT_UNKNOWN: sprintf(szVarType, "VT_BYREF"); break;830 case VT_UNKNOWN: sprintf(szVarType, "VT_UNKNOWN"); break; 818 831 case VT_DISPATCH: sprintf(szVarType, "VT_DISPATCH"); break; 819 case VT_ARRAY: sprintf(szVarType, "VT_ARRAY"); break;820 832 case VT_I1: sprintf(szVarType, "VT_I1"); break; 821 833 case VT_UI2: sprintf(szVarType, "VT_UI2"); break; … … 838 850 break; 839 851 840 default: sprintf(szVarType, "unknown ");break;852 default: sprintf(szVarType, "unknown(%d)", pTD->vt & VT_TYPEMASK); break; 841 853 } 842 854 } … … 955 967 static void dump_Variant(VARIANT * pvar) 956 968 { 957 char szVarType[15]; 969 char szVarType[32]; 970 LPVOID ref; 958 971 959 972 TRACE("(%p)\n", pvar); … … 969 982 970 983 TRACE("VARTYPE: %s\n", szVarType); 971 984 985 if (V_VT(pvar) & VT_BYREF) { 986 ref = V_UNION(pvar, byref); 987 TRACE("%p\n", ref); 988 } 989 else ref = &V_UNION(pvar, cVal); 990 991 if (V_VT(pvar) & VT_ARRAY) { 992 /* FIXME */ 993 return; 994 } 995 if (V_VT(pvar) & VT_VECTOR) { 996 /* FIXME */ 997 return; 998 } 999 972 1000 switch (V_VT(pvar)) 973 1001 { 1002 case VT_I2: 1003 TRACE("%d\n", *(short*)ref); 1004 break; 1005 1006 case VT_I4: 1007 TRACE("%d\n", *(INT*)ref); 1008 break; 1009 974 1010 case VT_R4: 975 TRACE("%3.3e\n", V_UNION(pvar, fltVal));1011 TRACE("%3.3e\n", *(float*)ref); 976 1012 break; 977 1013 978 1014 case VT_R8: 979 TRACE("%3.3e\n", V_UNION(pvar, dblVal));1015 TRACE("%3.3e\n", *(double*)ref); 980 1016 break; 981 1017 1018 case VT_BOOL: 1019 TRACE("%s\n", *(VARIANT_BOOL*)ref ? "TRUE" : "FALSE"); 1020 break; 1021 1022 case VT_BSTR: 1023 TRACE("%s\n", debugstr_w(*(BSTR*)ref)); 1024 break; 1025 1026 case VT_UNKNOWN: 1027 case VT_DISPATCH: 1028 TRACE("%p\n", *(LPVOID*)ref); 1029 break; 1030 1031 case VT_VARIANT: 1032 if (V_VT(pvar) & VT_BYREF) dump_Variant(ref); 1033 break; 1034 982 1035 default: 983 TRACE(" %ld\n", V_UNION(pvar, lVal));1036 TRACE("(?)%ld\n", *(long*)ref); 984 1037 break; 985 1038 } 986 987 if (V_VT(pvar) & VT_BYREF)988 return dump_Variant(V_UNION(pvar,pvarVal));989 1039 } 990 1040 … … 1048 1098 #define dump_TLBFuncDesc(a) 1049 1099 #define dump_TypeDesc(a,b) 1100 #define dump_Variant(a) 1101 #define debugstr_an(a,b) NULL 1050 1102 #endif 1051 1103 … … 1622 1674 MSFT_GetTdesc(pcx, pVarRec->DataType, 1623 1675 &(*pptvd)->vardesc.elemdescVar.tdesc, pTI); 1624 /* (*pptvd)->vardesc.lpstrSchema; is reserved (SDK) fixme?? */1676 /* (*pptvd)->vardesc.lpstrSchema; is reserved (SDK) FIXME?? */ 1625 1677 if(pVarRec->VarKind == VAR_CONST ){ 1626 1678 (*pptvd)->vardesc.u.lpvarValue=TLB_Alloc(sizeof(VARIANT)); … … 1726 1778 /* this is where we are coming from */ 1727 1779 ptiRet->pTypeLib = pLibInfo; 1780 ITypeLib2_AddRef((ITypeLib2 *)pLibInfo); 1728 1781 ptiRet->index=count; 1729 1782 /* fill in the typeattr fields */ … … 1931 1984 ret = S_OK; 1932 1985 else 1933 ERR("Loading of typelib %s failed with error 0x%08lx\n",1986 ERR("Loading of typelib %s failed with error %ld\n", 1934 1987 debugstr_w(pszFileName), GetLastError()); 1935 1988 … … 1996 2049 /* TLIBATTR fields */ 1997 2050 MSFT_ReadGuid(&pTypeLibImpl->LibAttr.guid, tlbHeader.posguid, &cx); 1998 pTypeLibImpl->LibAttr.lcid = tlbHeader.lcid; 2051 2052 /* pTypeLibImpl->LibAttr.lcid = tlbHeader.lcid;*/ 2053 /* Windows seems to have zero here, is this correct? */ 2054 if(SUBLANGID(tlbHeader.lcid) == SUBLANG_NEUTRAL) 2055 pTypeLibImpl->LibAttr.lcid = PRIMARYLANGID(tlbHeader.lcid); 2056 else 2057 pTypeLibImpl->LibAttr.lcid = 0; 2058 1999 2059 pTypeLibImpl->LibAttr.syskind = tlbHeader.varflags & 0x0f; /* check the mask */ 2000 2060 pTypeLibImpl->LibAttr.wMajorVerNum = LOWORD(tlbHeader.version); … … 2759 2819 order = pBlkEntry[order].next - 1, i++) { 2760 2820 #ifdef __WIN32OS2__ 2761 2821 pBlk = (LPBYTE)pBlk + pBlkEntry[order].len; 2762 2822 #else 2763 2823 pBlk += pBlkEntry[order].len; 2764 2824 #endif 2765 2825 } … … 2867 2927 *ppTypeInfoImpl = (ITypeInfoImpl*)ITypeInfo_Constructor(); 2868 2928 (*ppTypeInfoImpl)->pTypeLib = pTypeLibImpl; 2929 ITypeLib2_AddRef((ITypeLib2 *)pTypeLibImpl); 2869 2930 (*ppTypeInfoImpl)->index = i; 2870 2931 (*ppTypeInfoImpl)->Name = TLB_MultiByteToBSTR( … … 2990 3051 if (!This->ref) 2991 3052 { 2992 /* fixmedestroy child objects */3053 /* FIXME destroy child objects */ 2993 3054 2994 3055 TRACE(" destroying ITypeLib(%p)\n",This); … … 3183 3244 * file. 3184 3245 * 3246 * On a successful return all non-null BSTR pointers will have been set, 3247 * possibly to NULL. 3185 3248 */ 3186 3249 static HRESULT WINAPI ITypeLib2_fnGetDocumentation( … … 3206 3269 if(index<0) 3207 3270 { 3208 /* documentation for the typelib */ 3209 if(pBstrName && This->Name) 3210 { 3211 *pBstrName = SysAllocString(This->Name); 3212 3213 if (!(*pBstrName)) return STG_E_INSUFFICIENTMEMORY; 3214 } 3215 if(pBstrDocString && This->DocString) 3216 { 3217 *pBstrDocString = SysAllocString(This->DocString); 3218 3219 if (!(*pBstrDocString)) return STG_E_INSUFFICIENTMEMORY; 3220 } 3221 3222 if(pdwHelpContext) 3223 { 3271 /* documentation for the typelib */ 3272 if(pBstrName) 3273 { 3274 if (This->Name) 3275 if(!(*pBstrName = SysAllocString(This->Name))) goto memerr1;else; 3276 else 3277 *pBstrName = NULL; 3278 } 3279 if(pBstrDocString) 3280 { 3281 if (This->DocString) 3282 if(!(*pBstrDocString = SysAllocString(This->DocString))) goto memerr2;else; 3283 else if (This->Name) 3284 if(!(*pBstrDocString = SysAllocString(This->Name))) goto memerr2;else; 3285 else 3286 *pBstrDocString = NULL; 3287 } 3288 if(pdwHelpContext) 3289 { 3224 3290 *pdwHelpContext = This->dwHelpContext; 3225 } 3226 if(pBstrHelpFile && This->HelpFile) 3227 { 3228 *pBstrHelpFile = SysAllocString(This->HelpFile); 3229 3230 if (!(*pBstrHelpFile)) return STG_E_INSUFFICIENTMEMORY; 3231 } 3232 3233 result = S_OK; 3291 } 3292 if(pBstrHelpFile) 3293 { 3294 if (This->HelpFile) 3295 if(!(*pBstrHelpFile = SysAllocString(This->HelpFile))) goto memerr3;else; 3296 else 3297 *pBstrHelpFile = NULL; 3298 } 3299 3300 result = S_OK; 3234 3301 } 3235 3302 else … … 3250 3317 } 3251 3318 return result; 3319 memerr3: 3320 if (pBstrDocString) SysFreeString (*pBstrDocString); 3321 memerr2: 3322 if (pBstrName) SysFreeString (*pBstrName); 3323 memerr1: 3324 return STG_E_INSUFFICIENTMEMORY; 3252 3325 } 3253 3326 … … 3891 3964 * interface described by the type description. 3892 3965 */ 3893 static DWORD _invoke(LPVOID func,CALLCONV callconv, int nrargs, DWORD *args) { 3966 DWORD 3967 _invoke(LPVOID func,CALLCONV callconv, int nrargs, DWORD *args) { 3894 3968 DWORD res; 3895 3969 … … 3905 3979 3906 3980 switch (nrargs) { 3981 #ifdef __WIN32OS2__ 3907 3982 case 0: { 3908 #ifdef __WIN32OS2__3909 3983 DWORD (* WINAPI xfunc)() = func; 3910 #else3911 DWORD (WINAPI *xfunc)() = func;3912 #endif3913 3984 res = xfunc(); 3914 3985 break; 3915 3986 } 3916 3987 case 1: { 3917 #ifdef __WIN32OS2__3918 3988 DWORD (* WINAPI xfunc)(DWORD) = func; 3919 #else3920 DWORD (WINAPI *xfunc)(DWORD) = func;3921 #endif3922 3989 res = xfunc(args[0]); 3923 3990 break; 3924 3991 } 3925 3992 case 2: { 3926 #ifdef __WIN32OS2__3927 3993 DWORD (* WINAPI xfunc)(DWORD,DWORD) = func; 3928 #else3929 DWORD (WINAPI *xfunc)(DWORD,DWORD) = func;3930 #endif3931 3994 res = xfunc(args[0],args[1]); 3932 3995 break; 3933 3996 } 3934 3997 case 3: { 3935 #ifdef __WIN32OS2__3936 3998 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD) = func; 3937 #else3938 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD) = func;3939 #endif3940 3999 res = xfunc(args[0],args[1],args[2]); 3941 4000 break; 3942 4001 } 4002 case 4: { 4003 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD,DWORD) = func; 4004 res = xfunc(args[0],args[1],args[2],args[3]); 4005 break; 4006 } 4007 case 5: { 4008 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD,DWORD,DWORD) = func; 4009 res = xfunc(args[0],args[1],args[2],args[3],args[4]); 4010 break; 4011 } 4012 case 6: { 4013 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD) = func; 4014 res = xfunc(args[0],args[1],args[2],args[3],args[4],args[5]); 4015 break; 4016 } 4017 case 7: { 4018 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD) = func; 4019 res = xfunc(args[0],args[1],args[2],args[3],args[4],args[5],args[6]); 4020 break; 4021 } 4022 #else 4023 case 0: { 4024 DWORD (WINAPI *xfunc)() = func; 4025 res = xfunc(); 4026 break; 4027 } 4028 case 1: { 4029 DWORD (WINAPI *xfunc)(DWORD) = func; 4030 res = xfunc(args[0]); 4031 break; 4032 } 4033 case 2: { 4034 DWORD (WINAPI *xfunc)(DWORD,DWORD) = func; 4035 res = xfunc(args[0],args[1]); 4036 break; 4037 } 4038 case 3: { 4039 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD) = func; 4040 res = xfunc(args[0],args[1],args[2]); 4041 break; 4042 } 4043 case 4: { 4044 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD,DWORD) = func; 4045 res = xfunc(args[0],args[1],args[2],args[3]); 4046 break; 4047 } 4048 case 5: { 4049 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD,DWORD,DWORD) = func; 4050 res = xfunc(args[0],args[1],args[2],args[3],args[4]); 4051 break; 4052 } 4053 case 6: { 4054 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD) = func; 4055 res = xfunc(args[0],args[1],args[2],args[3],args[4],args[5]); 4056 break; 4057 } 4058 case 7: { 4059 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD) = func; 4060 res = xfunc(args[0],args[1],args[2],args[3],args[4],args[5],args[6]); 4061 break; 4062 } 4063 #endif 3943 4064 default: 3944 4065 FIXME("unsupported number of arguments %d in stdcall\n",nrargs); … … 4026 4147 if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) { 4027 4148 for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) { 4028 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i ].tdesc);4149 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i+pDispParams->cArgs].tdesc); 4029 4150 /* If we are a pointer to a variant, we are done already */ 4030 4151 if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT)) … … 4032 4153 4033 4154 VariantInit(&pVarResult[i]); 4034 V_UNION(pVarResult+i,intVal) = args2[i ];4155 V_UNION(pVarResult+i,intVal) = args2[i+pDispParams->cArgs]; 4035 4156 4036 4157 if (tdesc->vt == VT_PTR) … … 4045 4166 if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD)) 4046 4167 V_VT(pVarResult+i) = VT_DISPATCH; 4047 TRACE("storing into variant: [%d] type %d, val %08x\n", 4048 i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal) 4049 ); 4168 TRACE("storing into variant: [%d]\n", i); 4169 dump_Variant(pVarResult+i); 4050 4170 } 4051 4171 } … … 4210 4330 FIXME("Can't find pRefType for ref %lx\n", hRefType); 4211 4331 if(pRefType && hRefType != -1) { 4212 ITypeLib *pTLib ;4332 ITypeLib *pTLib = NULL; 4213 4333 4214 4334 if(pRefType->pImpTLInfo == TLB_REF_INTERNAL) { … … 4249 4369 ppTInfo); 4250 4370 } 4371 if (pTLib != NULL) 4372 ITypeLib2_Release(pTLib); 4251 4373 } 4252 4374 }
Note:
See TracChangeset
for help on using the changeset viewer.