- Timestamp:
- Jan 2, 2000, 10:29:58 PM (26 years ago)
- Location:
- trunk/src/oleaut32
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/oleaut32/initterm.cpp
r951 r2296 1 /* $Id: initterm.cpp,v 1. 2 1999-09-15 23:26:08 sandervlExp $ */1 /* $Id: initterm.cpp,v 1.3 2000-01-02 21:29:57 davidr Exp $ */ 2 2 3 3 /* … … 41 41 } 42 42 43 //Global DLL Data 44 #pragma data_seg(_GLOBALDATA) 45 int globLoadNr = 0; 46 #pragma data_seg() 47 48 char oleaut32Path[CCHMAXPATH] = ""; 49 int loadNr = 0; 50 43 51 /*-------------------------------------------------------------------*/ 44 52 /* A clean up routine registered with DosExitList must be used if */ … … 72 80 switch (ulFlag) { 73 81 case 0 : 82 { 83 loadNr = globLoadNr++; 84 85 #if 0 86 strcpy(oleaut32Path, OSLibGetDllName(hModule)); 87 char *endofpath = strrchr(oleaut32Path, '\\'); 88 *(endofpath+1) = 0; 89 #endif 90 74 91 _ctordtorInit(); 75 92 … … 88 105 return 0UL; 89 106 107 OpenPrivateLogFiles(); 108 109 90 110 break; 111 } 91 112 case 1 : 92 113 UnregisterLxDll(hModule); … … 106 127 { 107 128 _ctordtorTerm(); 129 ClosePrivateLogFiles(); 108 130 DosExitList(EXLST_EXIT, cleanup); 109 131 return ; -
trunk/src/oleaut32/itypelib.h
r2021 r2296 1 /* $Id: itypelib.h,v 1. 1 1999-12-08 19:59:25davidr Exp $ */1 /* $Id: itypelib.h,v 1.2 2000-01-02 21:29:58 davidr Exp $ */ 2 2 /* 3 3 * OLE Typelib functions private header … … 179 179 /*6*/pSeg pGuidTab; /* all guids are stored here together with */ 180 180 /* offset in some table???? */ 181 /*7*/pSeg res07; /* always created, alway same size (0x200) */181 /*7*/pSeg pRes7; /* always created, alway same size (0x200) */ 182 182 /* purpose largely unknown */ 183 183 /*8*/pSeg pNameTab; /* name tables */ … … 188 188 /* parameter values */ 189 189 /*D*/pSeg pCDGuids; /* table with offsets for the guids and into the customer data table */ 190 /*E*/pSeg res0e; /* unknown */191 /*F*/pSeg res0f; /* unknown */190 /*E*/pSeg pResE; /* unknown */ 191 /*F*/pSeg pResF; /* unknown */ 192 192 } TLBSegDir; 193 193 … … 243 243 { 244 244 INT16 recsize; // record size including some xtra stuff 245 INT16 unk02; //245 INT16 index; // 99.12.19 This must be the function index :-) 246 246 INT DataType; /* data type of memeber, eg return of function */ 247 247 INT Flags; /* something to do with attribute flags (LOWORD) */ … … 296 296 INT16 res3; /* some offset into dunno what */ 297 297 INT OffsValue; /* value of the variable or the offset */ 298 /* in the data structure */ 299 /* optional attribute fields, the number of them is variable */ 300 /* controlled by record length */ 301 INT HelpContext; 302 INT oHelpString; 303 INT res9; /* unknown (-1) */ 304 INT oCustData; /* custom data for variable */ 305 INT HelpStringContext; 298 299 INT OptAttr[1]; 300 301 // /* in the data structure */ 302 // /* optional attribute fields, the number of them is variable */ 303 // /* controlled by record length */ 304 // INT HelpContext; 305 // INT oHelpString; 306 // INT res9; /* unknown (-1) */ 307 // INT oCustData; /* custom data for variable */ 308 // INT HelpStringContext; 306 309 } TLBVarRecord; 307 310 … … 407 410 408 411 ITypeLibImpl * m_pITypeLib; // Pointer to typelib resource... 412 BOOL m_fFree; // Set if we need to free m_pITypeLib 409 413 BOOL m_fValid; 410 414 HANDLE m_hHeap; // Heap Handle … … 426 430 void * m_pCustData; 427 431 TLBCDGuid * m_pCDGuid; 432 void * m_pRes7; 433 void * m_pResE; 434 void * m_pResF; 428 435 429 436 BOOL Read(HANDLE hFile, void * buffer, DWORD count, DWORD * pBytesRead, long where); … … 446 453 void GetTypedesc(int type, TYPEDESC * pTypedesc); 447 454 448 // Debug only...449 void DumpHeader();450 455 }; 451 456 -
trunk/src/oleaut32/oleaut32.cpp
r1034 r2296 1 /* $Id: oleaut32.cpp,v 1. 4 1999-09-24 21:55:24davidr Exp $ */1 /* $Id: oleaut32.cpp,v 1.5 2000-01-02 21:29:58 davidr Exp $ */ 2 2 /* 3 3 * OLEAUT32 … … 23 23 24 24 #include <debugdefs.h> 25 26 //****************************************************************************** 27 //Used to open any private logfiles used in oleaut32 28 //****************************************************************************** 29 void OpenPrivateLogFiles() 30 { 31 OpenPrivateLogFileTypelib(); 32 } 33 //****************************************************************************** 34 //Used to close all private logfiles used in oleaut32 35 //****************************************************************************** 36 void ClosePrivateLogFiles() 37 { 38 ClosePrivateLogFileTypelib(); 39 } 25 40 26 41 /*********************************************************************** -
trunk/src/oleaut32/oleaut32.h
r1729 r2296 1 /* $Id: oleaut32.h,v 1. 6 1999-11-14 01:26:36davidr Exp $ */1 /* $Id: oleaut32.h,v 1.7 2000-01-02 21:29:58 davidr Exp $ */ 2 2 /* 3 3 * Win32 OLE stubs for OS/2 … … 52 52 #include <heapstring.h> 53 53 54 extern int loadNr; 55 extern char * oleaut32Path; 56 57 void ClosePrivateLogFileTypelib(); 58 void OpenPrivateLogFileTypelib(); 59 54 60 #endif -
trunk/src/oleaut32/typelib.cpp
r2022 r2296 1 /* $Id: typelib.cpp,v 1.6 1999-12-08 19:59:58 davidr Exp $ */ 1 /* $Id: typelib.cpp,v 1.7 2000-01-02 21:29:58 davidr Exp $ */ 2 /* 3 * ITypelib interface 4 * 5 * 1/12/99 6 * 7 * Copyright 1999 David J. Raison 8 * Some portions based on original work on Wine 9 * Copyright 1997 Marcus Meissner 10 1999 Rein Klazes 11 * 12 * Project Odin Software License can be found in LICENSE.TXT 13 * 14 * NB: Logging from this module is piped into TLIB_n.LOG via 15 * the private logging interface. 16 */ 2 17 3 18 typedef enum tagREGKIND … … 8 23 } REGKIND; 9 24 25 #define PRIVATE_LOGGING // Private logfile 26 10 27 #include "oleaut32.h" 11 28 #include "olectl.h" 12 29 #include "oList.h" // linked list template 13 30 #include "itypelib.h" 31 32 static FILE *_privateLogFile = NULL; 33 34 // ---------------------------------------------------------------------- 35 // OpenPrivateLogFileTypelib 36 // ---------------------------------------------------------------------- 37 void OpenPrivateLogFileTypelib() 38 { 39 char logname[1024]; 40 41 sprintf(logname, "tlib_%d.log", loadNr); 42 _privateLogFile = fopen(logname, "w"); 43 #if 0 44 if(_privateLogFile == NULL) 45 { 46 sprintf(logname, "%stlib_%d.log", oleaut32Path, loadNr); 47 _privateLogFile = fopen(logname, "w"); 48 } 49 #endif 50 dprintfGlobal(("TLIB LOGFILE : %s", logname)); 51 } 52 53 // ---------------------------------------------------------------------- 54 // ClosePrivateLogFileTypelib 55 // ---------------------------------------------------------------------- 56 void ClosePrivateLogFileTypelib() 57 { 58 if(_privateLogFile) 59 { 60 fclose(_privateLogFile); 61 _privateLogFile = NULL; 62 } 63 } 14 64 15 65 // ====================================================================== … … 49 99 DWORD plen; 50 100 51 dprintf (("OLEAUT32: QueryPathOfRegTypeLib()"));101 dprintfGlobal(("OLEAUT32: QueryPathOfRegTypeLib()")); 52 102 53 103 if (HIWORD(guid)) … … 61 111 { 62 112 sprintf(xguid, "<guid 0x%08lx>", (DWORD)guid); 63 dprintf (("OLEAUT32: QueryPathOfRegTypeLib(%s,%d,%d,0x%04lx,%p) - stub!",113 dprintfGlobal(("OLEAUT32: QueryPathOfRegTypeLib(%s,%d,%d,0x%04lx,%p) - stub!", 64 114 xguid, wMaj, wMin, (DWORD)lcid, path)); 65 115 return E_FAIL; … … 72 122 return QueryPathOfRegTypeLib(guid, wMaj, wMin, PRIMARYLANGID(lcid), path); 73 123 74 dprintf (("OLEAUT32: QueryPathOfRegTypeLib() - key \"%s\" not found", typelibkey));124 dprintfGlobal(("OLEAUT32: QueryPathOfRegTypeLib() - key \"%s\" not found", typelibkey)); 75 125 return E_FAIL; 76 126 } … … 103 153 104 154 szFileA = HEAP_strdupWtoA(hHeap, 0, szFile); 105 dprintf (("OLEAUT32: LoadTypeLibEx(%s)", szFileA));155 dprintfGlobal(("OLEAUT32: LoadTypeLibEx(%s)", szFileA)); 106 156 107 157 // Sanity check... … … 119 169 { 120 170 HeapFree(hHeap, 0, szFileA); 121 dprintf ((" Invalid typelib file"));171 dprintfGlobal((" Invalid typelib file")); 122 172 return E_FAIL; 123 173 } … … 141 191 HRESULT res; 142 192 143 dprintf (("OLEAUT32: LoadTypeLib()"));193 dprintfGlobal(("OLEAUT32: LoadTypeLib()")); 144 194 145 195 return LoadTypeLibEx(szFile, REGKIND_DEFAULT, ppTLib); … … 162 212 HRESULT res; 163 213 164 dprintf (("OLEAUT32: LoadRegTypeLib()"));214 dprintfGlobal(("OLEAUT32: LoadRegTypeLib()")); 165 215 166 216 res = QueryPathOfRegTypeLib( rguid, wVerMajor, wVerMinor, lcid, &bstr); … … 186 236 may be NULL*/ 187 237 { 188 dprintf (("OLEAUT32: RegisterTypeLib() - stub\n"));238 dprintfGlobal(("OLEAUT32: RegisterTypeLib() - stub\n")); 189 239 190 240 return S_OK; /* FIXME: pretend everything is OK */ … … 203 253 SYSKIND syskind) 204 254 { 205 dprintf (("OLEAUT32: UnRegisterTypeLib() - stub"));255 dprintfGlobal(("OLEAUT32: UnRegisterTypeLib() - stub")); 206 256 207 257 return S_OK; /* FIXME: pretend everything is OK */ 208 258 } 259 260 // ====================================================================== 261 // Local functions. 262 // ====================================================================== 263 264 #if defined(DEBUG) 265 266 // ---------------------------------------------------------------------- 267 // dprintfLine2 268 // ---------------------------------------------------------------------- 269 static void dprintfLine2(void) 270 { 271 dprintf((LOG, "========================================")); 272 } 273 274 // ---------------------------------------------------------------------- 275 // dprintfLine 276 // ---------------------------------------------------------------------- 277 static void dprintfLine(void) 278 { 279 dprintf((LOG, "----------------------------------------")); 280 } 281 282 // ---------------------------------------------------------------------- 283 // TypeKindAsString 284 // ---------------------------------------------------------------------- 285 char * TypeKindAsString(int typekind) 286 { 287 char * p; 288 switch (typekind) 289 { 290 case TKIND_ENUM: p = "TKIND_ENUM"; break; 291 case TKIND_RECORD: p = "TKIND_RECORD"; break; 292 case TKIND_MODULE: p = "TKIND_MODULE"; break; 293 case TKIND_INTERFACE: p = "TKIND_INTERFACE"; break; 294 case TKIND_DISPATCH: p = "TKIND_DISPATCH"; break; 295 case TKIND_COCLASS: p = "TKIND_COCLASS"; break; 296 case TKIND_ALIAS: p = "TKIND_ALIAS"; break; 297 case TKIND_UNION: p = "TKIND_UNION"; break; 298 case TKIND_MAX: p = "TKIND_MAX"; break; 299 default: p = "*UNKNOWN*"; break; 300 } 301 return p; 302 } 303 304 // ---------------------------------------------------------------------- 305 // FuncKindAsString 306 // ---------------------------------------------------------------------- 307 char * FuncKindAsString(int funckind) 308 { 309 char * p; 310 switch (funckind) 311 { 312 case FUNC_VIRTUAL: p = "FUNC_VIRTUAL"; break; 313 case FUNC_PUREVIRTUAL: p = "FUNC_PUREVIRTUAL"; break; 314 case FUNC_NONVIRTUAL: p = "FUNC_NONVIRTUAL"; break; 315 case FUNC_STATIC: p = "FUNC_STATIC"; break; 316 case FUNC_DISPATCH: p = "FUNC_DISPATCH"; break; 317 default: p = "*UNKNOWN*"; break; 318 } 319 return p; 320 } 321 322 // ---------------------------------------------------------------------- 323 // InvKindAsString 324 // ---------------------------------------------------------------------- 325 char * InvKindAsString(int invkind) 326 { 327 char * p; 328 switch (invkind) 329 { 330 case INVOKE_FUNC: p = "INVOKE_FUNC"; break; 331 case INVOKE_PROPERTYGET: p = "INVOKE_PROPERTYGET"; break; 332 case INVOKE_PROPERTYPUT: p = "INVOKE_PROPERTYPUT"; break; 333 case INVOKE_PROPERTYPUTREF: p = "INVOKE_PROPERTYPUTREF"; break; 334 default: p = "*UNKNOWN*"; break; 335 } 336 return p; 337 } 338 339 // ---------------------------------------------------------------------- 340 // VarKindAsString 341 // ---------------------------------------------------------------------- 342 char * VarKindAsString(int varkind) 343 { 344 char * p; 345 switch (varkind) 346 { 347 case VAR_PERINSTANCE: p = "VAR_PERINSTANCE"; break; 348 case VAR_STATIC: p = "VAR_STATIC"; break; 349 case VAR_CONST: p = "VAR_CONST"; break; 350 case VAR_DISPATCH: p = "VAR_DISPATCH"; break; 351 default: p = "*UNKNOWN*"; break; 352 } 353 return p; 354 } 355 356 // ---------------------------------------------------------------------- 357 // CallConvAsString 358 // ---------------------------------------------------------------------- 359 char * CallConvAsString(int callconv) 360 { 361 char * p; 362 switch (callconv) 363 { 364 case CC_CDECL: p = "CC_CDECL"; break; 365 // case CC_MSCPASCAL: p = "CC_MSCPASCAL"; break; 366 case CC_PASCAL: p = "CC_PASCAL"; break; 367 case CC_MACPASCAL: p = "CC_MACPASCAL"; break; 368 case CC_STDCALL: p = "CC_STDCALL"; break; 369 case CC_RESERVED: p = "CC_RESERVED"; break; 370 case CC_SYSCALL: p = "CC_SYSCALL"; break; 371 case CC_MPWCDECL: p = "CC_MPWCDECL"; break; 372 case CC_MPWPASCAL: p = "CC_MPWPASCAL"; break; 373 case CC_MAX: p = "CC_MAX"; break; 374 375 default: p = "*UNKNOWN*"; break; 376 } 377 return p; 378 } 379 380 // ---------------------------------------------------------------------- 381 // VariantAsString 382 // ---------------------------------------------------------------------- 383 char * VariantTypeAsString(int vt) 384 { 385 char * p; 386 387 switch(vt & VT_TYPEMASK) 388 { 389 case VT_EMPTY: p = "VT_EMPTY"; break; 390 case VT_NULL: p = "VT_NULL"; break; 391 case VT_I2: p = "VT_I2"; break; 392 case VT_I4: p = "VT_I4"; break; 393 case VT_R4: p = "VT_R4"; break; 394 case VT_ERROR: p = "VT_ERROR"; break; 395 case VT_BOOL: p = "VT_BOOL"; break; 396 case VT_I1: p = "VT_I1"; break; 397 case VT_UI1: p = "VT_UI1"; break; 398 case VT_UI2: p = "VT_UI2"; break; 399 case VT_UI4: p = "VT_UI4"; break; 400 case VT_INT: p = "VT_INT"; break; 401 case VT_UINT: p = "VT_UINT"; break; 402 case VT_VOID: p = "VT_VOID"; break; 403 case VT_HRESULT: p = "VT_HRESULT"; break; 404 case VT_R8: p = "VT_R8"; break; 405 case VT_CY: p = "VT_CY"; break; 406 case VT_DATE: p = "VT_DATE"; break; 407 case VT_I8: p = "VT_I8"; break; 408 case VT_UI8: p = "VT_UI8"; break; 409 case VT_DECIMAL: p = "VT_DECIMAL"; break; 410 case VT_FILETIME: p = "VT_FILETIME"; break; 411 case VT_BSTR: p = "VT_BSTR"; break; 412 case VT_DISPATCH: p = "VT_DISPATCH"; break; 413 case VT_VARIANT: p = "VT_VARIANT"; break; 414 case VT_UNKNOWN: p = "VT_UNKNOWN"; break; 415 case VT_PTR: p = "VT_PTR"; break; 416 case VT_SAFEARRAY: p = "VT_SAFEARRAY"; break; 417 case VT_CARRAY: p = "VT_CARRAY"; break; 418 case VT_USERDEFINED: p = "VT_USERDEFINED"; break; 419 case VT_LPSTR: p = "VT_LPSTR"; break; 420 case VT_LPWSTR: p = "VT_LPWSTR"; break; 421 case VT_BLOB: p = "VT_BLOB"; break; 422 case VT_STREAM: p = "VT_STREAM"; break; 423 case VT_STORAGE: p = "VT_STORAGE"; break; 424 case VT_STREAMED_OBJECT: p = "VT_STREAMED_OBJECT"; break; 425 case VT_STORED_OBJECT: p = "VT_STORED_OBJECT"; break; 426 case VT_BLOB_OBJECT: p = "VT_BLOB_OBJECT"; break; 427 case VT_CF: p = "VT_CF"; break; 428 case VT_CLSID: p = "VT_CLSID"; break; 429 default: p = "*UNKNOWN*"; break; 430 } 431 432 return p; 433 } 434 435 // ---------------------------------------------------------------------- 436 // VariantTypeAsString2 437 // ---------------------------------------------------------------------- 438 char * VariantTypeAsString2(int vt) 439 { 440 char * p; 441 442 switch(vt & VT_TYPEMASK) 443 { 444 case VT_EMPTY: p = "(empty)"; break; 445 case VT_NULL: p = "(null)"; break; 446 case VT_I2: p = "short"; break; 447 case VT_I4: p = "long"; break; 448 case VT_R4: p = "float"; break; 449 case VT_ERROR: p = "(error)"; break; 450 case VT_BOOL: p = "boolean"; break; 451 case VT_I1: p = "char"; break; 452 case VT_UI1: p = "unsigned char"; break; 453 case VT_UI2: p = "unsigned short"; break; 454 case VT_UI4: p = "unsigned long"; break; 455 case VT_INT: p = "int"; break; 456 case VT_UINT: p = "unsigned int"; break; 457 case VT_VOID: p = "void"; break; 458 case VT_HRESULT: p = "HRESULT"; break; 459 case VT_R8: p = "double"; break; 460 case VT_CY: p = "currency"; break; 461 case VT_DATE: p = "date"; break; 462 case VT_I8: p = "long long"; break; 463 case VT_UI8: p = "unsigned long long"; break; 464 case VT_DECIMAL: p = "decimal"; break; 465 case VT_FILETIME: p = "FILETIME"; break; 466 case VT_BSTR: p = "BSTR"; break; 467 case VT_DISPATCH: p = "IDISPATCH"; break; 468 case VT_VARIANT: p = "VARIANT"; break; 469 case VT_UNKNOWN: p = "IUNKNOWN"; break; 470 case VT_PTR: p = "*"; break; 471 case VT_SAFEARRAY: p = "SAFEARRAY"; break; 472 case VT_CARRAY: p = "CARRAY"; break; 473 case VT_USERDEFINED: p = "USERDEFINED"; break; 474 case VT_LPSTR: p = "LPSTR"; break; 475 case VT_LPWSTR: p = "LPWSTR"; break; 476 case VT_BLOB: p = "BLOB"; break; 477 case VT_STREAM: p = "STREAM"; break; 478 case VT_STORAGE: p = "STORAGE"; break; 479 case VT_STREAMED_OBJECT: p = "STREAMED_OBJECT"; break; 480 case VT_STORED_OBJECT: p = "STORED_OBJECT"; break; 481 case VT_BLOB_OBJECT: p = "BLOB_OBJECT"; break; 482 case VT_CF: p = "CF"; break; 483 case VT_CLSID: p = "CLSID"; break; 484 default: p = "*UNKNOWN*"; break; 485 } 486 487 return p; 488 } 489 // ---------------------------------------------------------------------- 490 // dprintTypeDesc 491 // ---------------------------------------------------------------------- 492 size_t sprintfTypeDesc(char * buf, TYPEDESC * pDesc) 493 { 494 LONG ii; 495 size_t len = 0; 496 497 if (pDesc->vt & VT_ARRAY) 498 { 499 ARRAYDESC * pArray = V_UNION(pDesc, lpadesc); 500 501 len += sprintfTypeDesc(buf + len, &pArray->tdescElem); 502 for (ii = 0; ii < pArray->cDims; ii++) 503 { 504 if (ii) 505 len += sprintf(buf + len, ", "); 506 507 len += sprintf(buf + len, "[%ld..%ld]", pArray->rgbounds[ii].lLbound, 508 pArray->rgbounds[ii].lLbound + pArray->rgbounds[ii].cElements); 509 } 510 511 } 512 else if (pDesc->vt == VT_PTR) 513 { 514 len += sprintfTypeDesc(buf + len, V_UNION(pDesc, lptdesc)) ; // 'ware recursion...! 515 len += sprintf(buf + len, "%s ", VariantTypeAsString2(pDesc->vt)); 516 } 517 else if (pDesc->vt == VT_USERDEFINED) 518 { 519 len += sprintf(buf + len, "(%ld) ", V_UNION(pDesc, hreftype) ); 520 } 521 else 522 { 523 len += sprintf(buf + len, "%s ", VariantTypeAsString2(pDesc->vt)); 524 } 525 return len; 526 } 527 528 typedef struct FlagSt 529 { 530 char * name; 531 ULONG value; 532 } FLAGST; 533 534 static FLAGST FKCCICFlagData[] = 535 { 536 {"custom data", 0x80}, 537 {"default values", 0x1000}, 538 {"numeric entry", 0x2000}, 539 {"has retval", 0x4000}, // Set for methods with a retval parameter 540 {"0x8000", 0x8000}, 541 {0, 0} 542 }; 543 544 static FLAGST VarFlagData[] = 545 { 546 {"readonly", 0x1}, 547 {"source", 0x2}, 548 {"bindable", 0x4}, 549 {"requestedit ", 0x8}, 550 {"displaybind ", 0x10}, 551 {"defaultbinD ", 0x20}, 552 {"hidden", 0x40}, 553 {"restricted", 0x80}, 554 {"defaultcollElem", 0x100}, 555 {"uidefault ", 0x200}, 556 {"nonbrowsable", 0x400}, 557 {"replaceable ", 0x800}, 558 {"immediatebind ", 0x1000}, 559 {0, 0} 560 }; 561 562 static FLAGST ParamFlagData[] = 563 { 564 {"in", 0x01}, 565 {"out", 0x02}, 566 {"lcid", 0x04}, 567 {"retval", 0x08}, 568 {"opt", 0x10}, 569 {"hasdefault", 0x20}, 570 {0, 0} 571 }; 572 573 static FLAGST FuncFlagData[] = 574 { 575 {"restricted", 0x1}, 576 {"source", 0x2}, 577 {"bindable", 0x4}, 578 {"requestedit", 0x8}, 579 {"displaybind", 0x10}, 580 {"defaultbind", 0x20}, 581 {"hidden", 0x40}, 582 {"usesgetlasterror", 0x80}, 583 {"defaultcollelem", 0x100}, 584 {"uidefault", 0x200}, 585 {"nonbrowsable", 0x400}, 586 {"replaceable", 0x800}, 587 {"immediatebind", 0x1000}, 588 {0, 0} 589 }; 590 591 // ---------------------------------------------------------------------- 592 // sprintfFlags 593 // ---------------------------------------------------------------------- 594 size_t sprintfFlags(char * buf, FLAGST const * pData, ULONG flags) 595 { 596 size_t len = 0; 597 598 len += sprintf(buf + len, "["); 599 600 while (pData->name != 0) 601 { 602 if (flags & pData->value) 603 { 604 if (len > 1) 605 len += sprintf(buf + len, ", "); 606 607 len += sprintf(buf + len, pData->name); 608 } 609 pData++; 610 } 611 len += sprintf(buf + len, "]"); 612 613 return len; 614 } 615 616 617 #endif 209 618 210 619 // ====================================================================== … … 215 624 // TypeLibExtract::TypeLibExtract 216 625 // ---------------------------------------------------------------------- 217 TypeLibExtract::TypeLibExtract(char * szName) : m_fValid(0), m_hHeap(GetProcessHeap()) 626 TypeLibExtract::TypeLibExtract(char * szName) 627 : m_fValid(0), m_hHeap(GetProcessHeap()), m_fFree(FALSE) 218 628 { 219 629 if ((Load(szName) == S_OK) 220 630 && (EstablishPointers() == S_OK)) 221 631 { 222 632 m_fValid = TRUE; … … 231 641 m_fValid = 0; 232 642 233 if (m_ pTypeLib)643 if (m_fFree) 234 644 HeapFree(m_hHeap, 0, m_pTypeLib); 235 645 … … 244 654 // Locate segment directory... 245 655 m_pHeader = (TLB2Header *)m_pTypeLib; 656 246 657 if (m_pHeader->varflags & HELPDLLFLAG) 247 658 { … … 259 670 if (m_pSegDir->pTypeInfoTab.res0c != 0x0F || m_pSegDir->pImpInfo.res0c != 0x0F) 260 671 { 261 dprintf(( " Segment directory sanity check failed!"));672 dprintf((LOG, " Segment directory sanity check failed!")); 262 673 return E_FAIL; 263 674 } 264 675 265 // m_pLib 266 if (m_pSegDir->pImpInfo.offset > 0) 676 // Decode the segment offsets... 677 dprintf((LOG, "Segment Offsets:")); 678 679 if (m_pSegDir->pImpInfo.offset != 0xffffffff) 680 { 267 681 m_pImpInfo = (TLBImpInfo *)((char *)m_pTypeLib + m_pSegDir->pImpInfo.offset); 268 else 682 dprintf((LOG, " ImpInfo 0x%08lx", m_pSegDir->pImpInfo.offset)); 683 } 684 else 685 { 269 686 m_pImpInfo = 0; 270 271 if (m_pSegDir->pRefTab.offset > 0) 687 } 688 689 if (m_pSegDir->pRefTab.offset != 0xffffffff) 690 { 272 691 m_pRef = (TLBRefRecord *)((char *)m_pTypeLib + m_pSegDir->pRefTab.offset); 273 else 692 dprintf((LOG, " RefTab 0x%08lx", m_pSegDir->pRefTab.offset)); 693 } 694 else 695 { 274 696 m_pRef = 0; 275 276 if (m_pSegDir->pGuidTab.offset > 0) 697 } 698 699 if (m_pSegDir->pGuidTab.offset != 0xffffffff) 700 { 277 701 m_pGUID = (GUID *)((char *)m_pTypeLib + m_pSegDir->pGuidTab.offset); 278 else 702 dprintf((LOG, " GuidTab 0x%08lx", m_pSegDir->pGuidTab.offset)); 703 } 704 else 705 { 279 706 m_pGUID = 0; 280 281 if (m_pSegDir->pNameTab.offset > 0) 707 } 708 709 if (m_pSegDir->pNameTab.offset != 0xffffffff) 710 { 282 711 m_pName = (TLBName *)((char *)m_pTypeLib + m_pSegDir->pNameTab.offset); 283 else 712 dprintf((LOG, " NameTab 0x%08lx", m_pSegDir->pNameTab.offset)); 713 } 714 else 715 { 284 716 m_pName = 0; 285 286 if (m_pSegDir->pStringTab.offset > 0) 717 } 718 719 if (m_pSegDir->pStringTab.offset != 0xffffffff) 720 { 287 721 m_pString = (TLBString *)((char *)m_pTypeLib + m_pSegDir->pStringTab.offset); 288 else 722 dprintf((LOG, " StringTab 0x%08lx", m_pSegDir->pStringTab.offset)); 723 } 724 else 725 { 289 726 m_pString = 0; 290 291 if (m_pSegDir->pTypedescTab.offset > 0) 727 } 728 729 if (m_pSegDir->pTypedescTab.offset != 0xffffffff) 730 { 292 731 m_pTypedesc = (TLBTypedesc *)((char *)m_pTypeLib + m_pSegDir->pTypedescTab.offset); 293 else 732 dprintf((LOG, " TypedescTab 0x%08lx", m_pSegDir->pTypedescTab.offset)); 733 } 734 else 735 { 294 736 m_pTypedesc = 0; 295 296 if (m_pSegDir->pTypedescTab.offset > 0) 297 m_pArray = (TLBArray *)((char *)m_pTypeLib + m_pSegDir->pTypedescTab.offset); 298 else 737 } 738 739 if (m_pSegDir->pCustData.offset != 0xffffffff) 740 { 741 m_pCustData = (void *)((char *)m_pTypeLib + m_pSegDir->pCustData.offset); 742 dprintf((LOG, " CustData 0x%08lx", m_pSegDir->pCustData.offset)); 743 } 744 else 745 { 746 m_pCustData = 0; 747 } 748 749 if (m_pSegDir->pCDGuids.offset != 0xffffffff) 750 { 751 m_pCDGuid = (TLBCDGuid *)((char *)m_pTypeLib + m_pSegDir->pCDGuids.offset); 752 dprintf((LOG, " CDGuids 0x%08lx", m_pSegDir->pCDGuids.offset)); 753 } 754 else 755 { 756 m_pCDGuid = 0; 757 } 758 759 if (m_pSegDir->pImpFiles.offset != 0xffffffff) 760 { 761 m_pImpFile = (TLBImpFile *)((char *)m_pTypeLib + m_pSegDir->pImpFiles.offset); 762 dprintf((LOG, " ImpFiles 0x%08lx", m_pSegDir->pImpFiles.offset)); 763 } 764 else 765 { 766 m_pImpFile = 0; 767 } 768 769 if (m_pSegDir->pTypeInfoTab.offset != 0xffffffff) 770 { 771 m_pTypeInfo = (TLBTypeInfoBase *)((char *)m_pTypeLib + m_pSegDir->pTypeInfoTab.offset); 772 dprintf((LOG, " TypeInfoTab 0x%08lx", m_pSegDir->pTypeInfoTab.offset)); 773 } 774 else 775 { 776 m_pTypeInfo = 0; 777 } 778 779 if (m_pSegDir->pArrayDescriptions.offset != 0xffffffff) 780 { 781 m_pArray = (TLBArray *)((char *)m_pTypeLib + m_pSegDir->pArrayDescriptions.offset); 782 dprintf((LOG, " ArrayDesc 0x%08lx", m_pSegDir->pArrayDescriptions.offset)); 783 } 784 else 785 { 299 786 m_pArray = 0; 300 301 if (m_pSegDir->pCustData.offset > 0) 302 m_pCustData = (void *)((char *)m_pTypeLib + m_pSegDir->pCustData.offset); 303 else 304 m_pCustData = 0; 305 306 if (m_pSegDir->pCDGuids.offset > 0) 307 m_pCDGuid = (TLBCDGuid *)((char *)m_pTypeLib + m_pSegDir->pCDGuids.offset); 308 else 309 m_pCDGuid = 0; 310 311 if (m_pSegDir->pImpFiles.offset > 0) 312 m_pImpFile = (TLBImpFile *)((char *)m_pTypeLib + m_pSegDir->pImpFiles.offset); 313 else 314 m_pImpFile = 0; 315 316 if (m_pSegDir->pTypeInfoTab.offset > 0) 317 m_pTypeInfo = (TLBTypeInfoBase *)((char *)m_pTypeLib + m_pSegDir->pTypeInfoTab.offset); 318 else 319 m_pTypeInfo = 0; 787 } 788 789 if (m_pSegDir->pRes7.offset != 0xffffffff) 790 { 791 m_pRes7 = (void *)((char *)m_pTypeLib + m_pSegDir->pRes7.offset); 792 dprintf((LOG, " Res7 0x%08lx", m_pSegDir->pRes7.offset)); 793 } 794 else 795 { 796 m_pRes7 = 0; 797 } 798 799 if (m_pSegDir->pResE.offset != 0xffffffff) 800 { 801 m_pResE = (void *)((char *)m_pTypeLib + m_pSegDir->pResE.offset); 802 dprintf((LOG, " ResE 0x%08lx", m_pSegDir->pResE.offset)); 803 } 804 else 805 { 806 m_pResE = 0; 807 } 808 809 if (m_pSegDir->pResF.offset != 0xffffffff) 810 { 811 m_pResF = (void *)((char *)m_pTypeLib + m_pSegDir->pResF.offset); 812 dprintf((LOG, " ResF 0x%08lx", m_pSegDir->pResF.offset)); 813 } 814 else 815 { 816 m_pResF = 0; 817 } 320 818 321 819 return S_OK; … … 509 1007 default: 510 1008 size = 0; 511 dprintf(( "OLEAUT32:VARTYPE %d is not supported, setting pointer to NULL\n", pVar->vt));1009 dprintf((LOG, " VARTYPE %d is not supported, setting pointer to NULL\n", pVar->vt)); 512 1010 } 513 1011 … … 525 1023 TLBCustData * pNew; 526 1024 527 while (offset >=0)1025 while (offset != 0xffffffff) 528 1026 { 529 1027 pCDGuid = (TLBCDGuid *)((char *)m_pCDGuid + offset); 530 1028 pNew = new TLBCustData; 1029 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 531 1030 532 1031 ParseGuid(pCDGuid->GuidOffset, &(pNew->guid)); … … 568 1067 ParseName(pBase->NameOffset, &pTypeInfo->szName); 569 1068 570 dprintf((" -> typeinfo \"%s\"\n", pTypeInfo->szName));571 572 1069 /* help info */ 573 1070 ParseString(pBase->docstringoffs, &pTypeInfo->szDocString); … … 578 1075 */ 579 1076 1077 #if defined(DEBUG) 1078 dprintfLine2(); 1079 dprintf((LOG, "TypeInfo %s", pTypeInfo->szName)); 1080 dprintf((LOG, " .typeKind: %08x (%s)", pTypeInfo->TypeAttr.typekind, 1081 TypeKindAsString(pTypeInfo->TypeAttr.typekind))); 1082 char guid[128]; 1083 WINE_StringFromCLSID(&pTypeInfo->TypeAttr.guid, guid); 1084 dprintf((LOG, " .GUID: %s", guid)); 1085 dprintf((LOG, " .lcid: %08x", pTypeInfo->TypeAttr.lcid)); 1086 dprintf((LOG, " .memidCon: %08x", pTypeInfo->TypeAttr.memidConstructor)); 1087 dprintf((LOG, " .memidDest: %08x", pTypeInfo->TypeAttr.memidDestructor)); 1088 dprintf((LOG, " .SizeInst: %08x", pTypeInfo->TypeAttr.cbSizeInstance)); 1089 dprintf((LOG, " .cFuncs: %08x", pTypeInfo->TypeAttr.cFuncs)); 1090 dprintf((LOG, " .cVars: %08x", pTypeInfo->TypeAttr.cVars)); 1091 dprintf((LOG, " .cbAlignment: %08x", pTypeInfo->TypeAttr.cbAlignment)); 1092 dprintf((LOG, " .TypeFlags: %08x", pTypeInfo->TypeAttr.wTypeFlags)); 1093 dprintf((LOG, " .MajorVerNum: %08x", pTypeInfo->TypeAttr.wMajorVerNum)); 1094 dprintf((LOG, " .MinorVerNum: %08x", pTypeInfo->TypeAttr.wMinorVerNum)); 1095 dprintf((LOG, " .cImplTypes: %08x", pTypeInfo->TypeAttr.cImplTypes)); 1096 dprintf((LOG, " .cbSizeVft: %08x", pTypeInfo->TypeAttr.cbSizeVft)); 1097 #endif 1098 580 1099 // Functions/ 581 1100 ParseMembers(pTypeInfo, pBase); … … 588 1107 else if (pTypeInfo->TypeAttr.typekind != TKIND_DISPATCH) 589 1108 { 590 TLBRefType * pNew = new TLBRefType; 591 ParseReference(pBase->datatype1, pNew); 592 pTypeInfo->pImplements.AddAtEnd(pNew); 593 1109 if (pBase->datatype1 != 0xffffffff) 1110 { 1111 TLBRefType * pNew = new TLBRefType; 1112 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 1113 1114 dprintf((LOG, "Datatype1: %08x", pBase->datatype1)); 1115 ParseReference(pBase->datatype1, pNew); 1116 pTypeInfo->pImplements.AddAtEnd(pNew); 1117 } 594 1118 } 595 1119 596 1120 // Load Custom data 597 1121 ParseCustomData(pBase->oCustData, &pTypeInfo->pCustData); 1122 1123 #if defined(DEBUG) 1124 dprintfLine(); 1125 #endif 1126 598 1127 } 599 1128 … … 624 1153 } 625 1154 } 626 dprintf(( " WARNING: Cannot find a reference\n"));1155 dprintf((LOG, " WARNING: Cannot find a reference\n")); 627 1156 pNew->reference = -1; 628 1157 pNew->pImpTLInfo = (TLBImpLib *)-1; … … 656 1185 pRefRec = (TLBRefRecord *)((char *)m_pRef + offset); 657 1186 pNew = new TLBRefType; 1187 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 658 1188 659 1189 ParseReference(pRefRec->reftype, pNew); … … 698 1228 void TypeLibExtract::ParseMembers(ITypeInfoImpl * pTypeInfo, TLBTypeInfoBase * pBase) 699 1229 { 1230 char * pMemberRec; 700 1231 TLBFuncRecord * pFuncRec; 701 1232 TLBVarRecord * pVarRec; … … 707 1238 INT * pMemberID; 708 1239 INT * pMemberOff; 1240 INT * pDefaultOff; 1241 INT * pCustomOff; 1242 LONG lMembers = pTypeInfo->TypeAttr.cFuncs + pTypeInfo->TypeAttr.cVars; 709 1243 710 1244 // Map ptrs to sections of the typeinfo record... 711 1245 pInfoLen = (INT *)((char *)m_pTypeLib + pBase->memoffset); 712 p FuncRec = (TLBFuncRecord*)(pInfoLen + 1);713 pMemberID = (INT *)( (char *)pFuncRec + *pInfoLen);714 pNameOff = pMemberID + pTypeInfo->TypeAttr.cFuncs + pTypeInfo->TypeAttr.cVars;715 pMemberOff = pNameOff + pTypeInfo->TypeAttr.cFuncs + pTypeInfo->TypeAttr.cVars;1246 pMemberRec = (char *)(pInfoLen + 1); 1247 pMemberID = (INT *)(pMemberRec + *pInfoLen); 1248 pNameOff = pMemberID + lMembers; 1249 pMemberOff = pNameOff + lMembers; 716 1250 717 1251 // loop through each function... 718 1252 for (ii = 0; ii < pTypeInfo->TypeAttr.cFuncs; ii++) 719 1253 { 1254 // Get record... 1255 pFuncRec = (TLBFuncRecord *)(pMemberRec + pMemberOff[ii]); 1256 720 1257 TLBFuncDesc * pNew; 721 1258 722 1259 pNew = new TLBFuncDesc; 1260 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 1261 723 1262 ParseName(pNameOff[ii], &pNew->szName); 724 725 dprintf((" -> function \"%s\"\n", pNew->szName));726 727 // decode optional attributes728 iAttrCount = (pFuncRec->recsize729 - pFuncRec->nrargs * 3 * sizeof(int) - 0x18) / sizeof(int);730 731 if (iAttrCount > 0)732 pNew->helpcontext = pFuncRec->OptAttr[0] ;733 734 if (iAttrCount > 1)735 ParseString(pFuncRec->OptAttr[1], &pNew->szHelpString);736 737 if (iAttrCount > 2)738 {739 if (pFuncRec->FKCCIC & 0x2000)740 pNew->szEntry = (char *) pFuncRec->OptAttr[2] ;741 else742 ParseString(pFuncRec->OptAttr[2], &pNew->szEntry);743 }744 745 if (iAttrCount > 5 )746 pNew->lHelpStringContext = pFuncRec->OptAttr[5] ;747 748 if (iAttrCount > 6 && pFuncRec->FKCCIC & 0x80)749 ParseCustomData(pFuncRec->OptAttr[6], &pNew->pCustData);750 751 1263 // fill the FuncDesc Structure 752 1264 pNew->funcdesc.memid = pMemberID[ii]; … … 760 1272 GetTypedesc(pFuncRec->DataType, &pNew->funcdesc.elemdescFunc.tdesc) ; 761 1273 1274 // Calc remaining attributes to be decoded. 1275 iAttrCount = pFuncRec->recsize 1276 - 24 // OFFSETOF(OptAttr[0]) 1277 - (pFuncRec->nrargs * sizeof(TLBParameterInfo)); 1278 1279 iAttrCount /= sizeof(INT); 1280 1281 // If the 'default values' flag is set 1282 // allow for a default value for each argument 1283 // (include the return value) 1284 if (pFuncRec->FKCCIC & 0x1000) 1285 iAttrCount -= pFuncRec->nrargs; 1286 1287 // If the 'custom data' flag is set 1288 // allow for one dataoffset for the method 1289 // plus one for each argument 1290 // (include the return value) 1291 if (pFuncRec->FKCCIC & 0x0080) 1292 iAttrCount -= pFuncRec->nrargs + 1; 1293 1294 // Loop through 'size specified' block to rip info... 1295 for (jj = 0; jj < iAttrCount; jj++) 1296 { 1297 switch(jj) 1298 { 1299 case 0: 1300 pNew->helpcontext = pFuncRec->OptAttr[jj]; 1301 break; 1302 1303 case 1: 1304 ParseString(pFuncRec->OptAttr[jj], &pNew->szHelpString); 1305 break; 1306 1307 case 2: 1308 if (pFuncRec->FKCCIC & 0x2000) 1309 pNew->szEntry = (char *)(pFuncRec->OptAttr[jj]); 1310 else 1311 ParseString(pFuncRec->OptAttr[jj], &pNew->szEntry); 1312 break; 1313 1314 case 5: 1315 pNew->lHelpStringContext = pFuncRec->OptAttr[jj]; 1316 break; 1317 1318 default: 1319 if (pFuncRec->OptAttr[jj] != 0xffffffff) 1320 dprintf((LOG, "- skipping pFuncRec->OptAttr[%lx] (%08x)...", 1321 jj, pFuncRec->OptAttr[jj])); 1322 } 1323 } 1324 1325 // Default & custom data come after size specified' block... 1326 pCustomOff = pDefaultOff = pFuncRec->OptAttr + iAttrCount; 1327 1328 // Only advance custom data if there are defaults... 1329 if (pFuncRec->FKCCIC & 0x1000) 1330 pCustomOff += pFuncRec->nrargs; 1331 1332 // Rip the method custom data... 1333 if (pFuncRec->FKCCIC & 0x80) 1334 ParseCustomData(pCustomOff[0], &pNew->pCustData); 1335 1336 #if defined(DEBUG) 1337 { 1338 dprintfLine(); 1339 char buf[1024]; 1340 dprintf((LOG, "Method \"%s\"\n", pNew->szName)); 1341 dprintf((LOG, " .memid %08x", pNew->funcdesc.memid)); 1342 dprintf((LOG, " .funckind %08x (%s)", 1343 pNew->funcdesc.funckind, 1344 FuncKindAsString(pNew->funcdesc.funckind))); 1345 dprintf((LOG, " .invkind %08x (%s)", 1346 pNew->funcdesc.invkind, 1347 InvKindAsString(pNew->funcdesc.invkind))); 1348 dprintf((LOG, " .callconv %08x (%s)", 1349 pNew->funcdesc.callconv, 1350 CallConvAsString(pNew->funcdesc.callconv))); 1351 dprintf((LOG, " .cParams %08x", pNew->funcdesc.cParams)); 1352 dprintf((LOG, " .cParamsOpt %08x", pNew->funcdesc.cParamsOpt)); 1353 dprintf((LOG, " .oVft %08x", pNew->funcdesc.oVft)); 1354 sprintfFlags(buf, FuncFlagData, pNew->funcdesc.wFuncFlags); 1355 dprintf((LOG, " .wFuncFlags %s", buf)); 1356 sprintfTypeDesc(buf, &pNew->funcdesc.elemdescFunc.tdesc); 1357 dprintf((LOG, " .tdesc %s", buf)); 1358 dprintf((LOG, " .helpcontext %08x", pNew->helpcontext)); 1359 dprintf((LOG, " .helpstring %s", pNew->szHelpString)); 1360 if (pFuncRec->FKCCIC & 0x2000) 1361 dprintf((LOG, " .entry %08x", pNew->szHelpString)); 1362 else 1363 dprintf((LOG, " .entry %s", pNew->szHelpString)); 1364 #if 0 1365 dprintf((LOG, "pFuncRec")); 1366 dprintf((LOG, " .recsize %08lx", pFuncRec->recsize)); 1367 dprintf((LOG, " .index %08lx", pFuncRec->index)); 1368 dprintf((LOG, " .Datatype %08lx", pFuncRec->DataType)); 1369 dprintf((LOG, " .Flags %08lx", pFuncRec->Flags)); 1370 dprintf((LOG, " .res3 %08lx", pFuncRec->res3)); 1371 1372 sprintfFlags(buf, FKCCICFlagData, pFuncRec->FKCCIC); 1373 dprintf((LOG, " .FKCCIC %08lx (%s)", pFuncRec->FKCCIC, buf)); 1374 dprintf((LOG, " .nrargs %04lx", pFuncRec->nrargs)); 1375 dprintf((LOG, " .nroargs %04lx", pFuncRec->nroargs)); 1376 for (jj = 0; 1377 (pFuncRec->recsize 1378 - (jj * sizeof(INT)) 1379 - 24 1380 - (pFuncRec->nrargs * sizeof(TLBParameterInfo))) > 0 ; 1381 jj++) 1382 dprintf((LOG, " .optattr[%d] %08lx", jj, pFuncRec->OptAttr[jj])); 1383 1384 #endif // 0 1385 } 1386 #endif // defined(DEBUG) 1387 762 1388 // do the parameters/arguments 763 1389 if (pFuncRec->nrargs) … … 779 1405 // Name 780 1406 ParseName(pParam->oName, &pNew->pParamDesc[jj].szName); 781 dprintf((" -> param \"%s\"\n", pNew->pParamDesc[jj].szName));782 1407 783 1408 // default value 784 1409 if ((PARAMFLAG_FHASDEFAULT & V_UNION(&(pNew->funcdesc. 785 lprgelemdescParam[jj]),paramdesc.wParamFlags)) && 786 ((pFuncRec->FKCCIC) & 0x1000)) 1410 lprgelemdescParam[jj]),paramdesc.wParamFlags)) ) 787 1411 { 788 INT *pInt = (INT *)((char *)pFuncRec + pFuncRec->recsize - 789 (pFuncRec->nrargs * 4 + 1) * sizeof(INT) ); 790 PARAMDESC * pParamDesc = &V_UNION(&(pNew->funcdesc. 791 lprgelemdescParam[jj]),paramdesc); 792 pParamDesc->pparamdescex = new PARAMDESCEX; 793 pParamDesc->pparamdescex->cBytes = sizeof(PARAMDESCEX); 794 ParseValue(pInt[jj], &(pParamDesc->pparamdescex->varDefaultValue)); 1412 if (pDefaultOff[jj] != 0xffffffff) // jic 1413 { 1414 PARAMDESC * pParamDesc = &V_UNION(&(pNew->funcdesc. 1415 lprgelemdescParam[jj]), paramdesc); 1416 pParamDesc->pparamdescex = new PARAMDESCEX; 1417 pParamDesc->pparamdescex->cBytes = sizeof(PARAMDESCEX); 1418 ParseValue(pDefaultOff[jj], &(pParamDesc->pparamdescex->varDefaultValue)); 1419 } 795 1420 } 796 1421 797 1422 // custom info 798 if (iAttrCount > 7 + jj && pFuncRec->FKCCIC & 0x80) 799 ParseCustomData(pFuncRec->OptAttr[7 + jj], &pNew->pParamDesc[jj].pCustData); 1423 if (pFuncRec->FKCCIC & 0x80) 1424 ParseCustomData(pCustomOff[1 + jj], &pNew->pParamDesc[jj].pCustData); 1425 1426 #if defined(DEBUG) 1427 dprintfLine(); 1428 dprintf((LOG, "Parameter \"%s\"\n", pNew->pParamDesc[jj].szName)); 1429 char buf[1024]; 1430 sprintfTypeDesc(buf, &pNew->funcdesc.lprgelemdescParam[jj].tdesc); 1431 dprintf((LOG, " .tdesc %s", buf)); 1432 sprintfFlags(buf, ParamFlagData, 1433 V_UNION(&pNew->funcdesc.lprgelemdescParam[jj], paramdesc.wParamFlags)); 1434 dprintf((LOG, " .wParamFlags %s", buf)); 1435 #endif 1436 800 1437 801 1438 pParam++; // Next record. … … 810 1447 pTypeInfo->pFunctions.AddAtEnd(pNew); 811 1448 812 // Next record... 813 pFuncRec = (TLBFuncRecord *)((char *)pFuncRec + pFuncRec->recsize); 814 } 815 816 // Wine calc's for this ptr were b**ll***s 817 pVarRec = (TLBVarRecord *)pFuncRec; 1449 } 818 1450 819 1451 for (ii = 0; ii < pTypeInfo->TypeAttr.cVars; ii++) 820 1452 { 1453 // Get record... 1454 pVarRec = (TLBVarRecord *)(pMemberRec + pMemberOff[pTypeInfo->TypeAttr.cFuncs + ii]); 1455 821 1456 TLBVarDesc * pNew; 822 1457 823 1458 pNew = new TLBVarDesc; 1459 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 824 1460 825 1461 // name, eventually add to a hash table 826 1462 ParseName(pNameOff[ii], &pNew->szName); 827 dprintf((" -> variable \"%s\"\n", pNew->szName)); 1463 1464 // Calc remaining attributes to be decoded. 1465 iAttrCount = pVarRec->recsize - 20; 1466 1467 iAttrCount /= sizeof(INT); 828 1468 829 1469 // Optional data 830 if (pVarRec->recsize > (6 * sizeof(INT)) ) 831 pNew->lHelpContext = pVarRec->HelpContext; 832 833 if (pVarRec->recsize > (7 * sizeof(INT)) ) 834 ParseString(pVarRec->oHelpString, &pNew->szHelpString); 835 836 if (pVarRec->recsize > (8 * sizeof(INT)) ) 837 ; 838 839 if (pVarRec->recsize > (9 * sizeof(INT)) ) 840 pNew->lHelpStringContext = pVarRec->HelpStringContext; 1470 for (jj = 0; jj < iAttrCount; jj++) 1471 { 1472 switch(jj) 1473 { 1474 case 0: 1475 pNew->lHelpContext = pVarRec->OptAttr[jj]; 1476 break; 1477 1478 case 1: 1479 ParseString(pVarRec->OptAttr[jj], &pNew->szHelpString); 1480 break; 1481 1482 case 4: 1483 pNew->lHelpStringContext = pVarRec->OptAttr[jj]; 1484 break; 1485 1486 default: 1487 if (pVarRec->OptAttr[jj] != 0xffffffff) 1488 dprintf((LOG, "- skipping pVarRec->OptAttr[%lx] (%08x)...", 1489 jj, pVarRec->OptAttr[jj])); 1490 1491 } 1492 } 841 1493 842 1494 // fill the VarDesc Structure … … 854 1506 V_UNION(&(pNew->vardesc), oInst) = pVarRec->OffsValue; 855 1507 1508 #if defined(DEBUG) 1509 { 1510 dprintfLine(); 1511 char buf[1024]; 1512 dprintf((LOG, "Variable \"%s\"\n", pNew->szName)); 1513 dprintf((LOG, " .MemberID %08x", pNew->vardesc.memid)); 1514 dprintf((LOG, " .VarKind %08x (%s)", 1515 pNew->vardesc.varkind, 1516 VarKindAsString(pNew->vardesc.varkind))); 1517 sprintfFlags(buf, FuncFlagData, pNew->vardesc.wVarFlags); 1518 dprintf((LOG, " .VarFlags %08x %s", pNew->vardesc.wVarFlags, buf)); 1519 sprintfTypeDesc(buf, &pNew->vardesc.elemdescVar.tdesc); 1520 dprintf((LOG, " .TDesc %s", buf)); 1521 dprintf((LOG, " .HelpContext %08x", pNew->lHelpContext)); 1522 dprintf((LOG, " .HelpStrCtx %08x", pNew->lHelpStringContext)); 1523 dprintf((LOG, " .HelpStr %s", pNew->szHelpString)); 1524 1525 dprintf((LOG, "pVarRec")); 1526 for (jj = 0; jj < iAttrCount; jj++) 1527 dprintf((LOG, " .optattr[%d] %08lx", jj, pVarRec->OptAttr[jj])); 1528 } 1529 1530 #endif // defined(DEBUG) 1531 856 1532 // Store 857 1533 pTypeInfo->pVariables.AddAtEnd(pNew); 858 859 // Next record... 860 pVarRec = (TLBVarRecord *)((char *)pVarRec + pVarRec->recsize); 861 } 862 } 1534 } 1535 } 1536 1537 typedef struct LoadSt 1538 { 1539 ULONG cLibs; 1540 VOID * * ppLib; 1541 } LoadSt; 863 1542 864 1543 // ---------------------------------------------------------------------- … … 869 1548 static BOOL WIN32API LoadSub(HANDLE hMod, LPCTSTR pResType, LPTSTR pResName, LONG lParm) 870 1549 { 871 dprintf((" LoadSub called")); 872 HRSRC hRsrc; 873 HGLOBAL hData; 874 875 hRsrc = FindResourceA(hMod, pResName, pResType); 876 hData = LoadResource(hMod, hRsrc); 877 *((void **)lParm) = LockResource(hData); 878 return FALSE; 1550 LoadSt * pLoad = (LoadSt *)lParm; 1551 1552 if (--pLoad->cLibs == 0) 1553 { 1554 1555 HRSRC hRsrc; 1556 HGLOBAL hData; 1557 1558 hRsrc = FindResourceA(hMod, pResName, pResType); 1559 hData = LoadResource(hMod, hRsrc); 1560 *(pLoad->ppLib) = LockResource(hData); 1561 return FALSE; 1562 } 1563 return TRUE; 879 1564 } 880 1565 … … 893 1578 HANDLE hFile; 894 1579 HRESULT rc; 895 896 dprintf(("OLEAUT32: TypeLibExtract::Load()")); 1580 HINSTANCE hInst; 1581 LoadSt loadData; 1582 1583 dprintf((LOG, "TypeLibExtract::Load()")); 897 1584 898 1585 // Open file 899 if ((hFile = OpenFile(szFile, &ofStruct, OF_READ)) == HFILE_ERROR) 900 { 901 dprintf((" Error opening file - 0x%08x", GetLastError())); 902 return E_ACCESSDENIED; 903 } 904 905 lStart = 0; 906 907 // Read first four byts of file to identify it... 908 if (!Read(hFile, (void *)buf, 4, &lReadLen, lStart)) 909 { 910 CloseHandle(hFile); 911 dprintf((" Failed to read file start bytes")); 912 return E_FAIL; 913 } 914 915 // Check to see if this is a type 1 typelib... 916 if ((buf[0] == 'S') && (buf[1] == 'L') && (buf[2] == 'T') && (buf[3] == 'G')) 917 { 918 dprintf((" File identified as TYPE1 TYPELIB - not supported yet :-(")); 919 CloseHandle(hFile); 920 return E_FAIL; 921 } 922 923 // Check to see if this is a type 2 typelib... 924 if ((buf[0] == 'M') && (buf[1] == 'S') && (buf[2] == 'F') && (buf[3] == 'T')) 925 { 926 // Get typelib file size... 927 lFileSize = GetFileSize(hFile, NULL); 928 dprintf((" File identified as TYPE2 TYPELIB - Loading image (%lu bytes)...", lFileSize)); 929 930 m_pTypeLib = HeapAlloc(m_hHeap, 0, lFileSize); 931 if (!m_pTypeLib) 1586 if ((hFile = OpenFile(szFile, &ofStruct, OF_READ)) != HFILE_ERROR) 1587 { 1588 lStart = 0; 1589 1590 // Read first four byts of file to identify it... 1591 if (!Read(hFile, (void *)buf, 4, &lReadLen, lStart)) 932 1592 { 933 1593 CloseHandle(hFile); 934 dprintf(( " Failed to allocate a memory pool for typelib image"));935 return E_ OUTOFMEMORY;1594 dprintf((LOG, " Failed to read file start bytes")); 1595 return E_FAIL; 936 1596 } 937 1597 938 // Read whole file into memory...939 if ( !Read(hFile, m_pTypeLib, lFileSize, &lReadLen, lStart))1598 // Check to see if this is a type 1 typelib... 1599 if ((buf[0] == 'S') && (buf[1] == 'L') && (buf[2] == 'T') && (buf[3] == 'G')) 940 1600 { 941 1601 CloseHandle(hFile); 942 dprintf((" Failed to read typelib")); 943 HeapFree(m_hHeap, 0, m_pTypeLib); 1602 dprintf((LOG, " File identified as TYPE1 TYPELIB - not supported yet :-(")); 944 1603 return E_FAIL; 945 1604 } 946 1605 947 // Return buffer... 1606 // Check to see if this is a type 2 typelib... 1607 if ((buf[0] == 'M') && (buf[1] == 'S') && (buf[2] == 'F') && (buf[3] == 'T')) 1608 { 1609 // Get typelib file size... 1610 lFileSize = GetFileSize(hFile, NULL); 1611 dprintf((LOG, " File identified as TYPE2 TYPELIB - Loading image (%lu bytes)", lFileSize)); 1612 1613 m_pTypeLib = HeapAlloc(m_hHeap, 0, lFileSize); 1614 if (!m_pTypeLib) 1615 { 1616 CloseHandle(hFile); 1617 dprintf((LOG, " Failed to allocate a memory pool for typelib image")); 1618 return E_OUTOFMEMORY; 1619 } 1620 1621 // Read whole file into memory... 1622 if (!Read(hFile, m_pTypeLib, lFileSize, &lReadLen, lStart)) 1623 { 1624 CloseHandle(hFile); 1625 dprintf((LOG, " Failed to read typelib")); 1626 HeapFree(m_hHeap, 0, m_pTypeLib); 1627 return E_FAIL; 1628 } 1629 1630 // Return buffer... 1631 CloseHandle(hFile); 1632 m_fFree = TRUE; 1633 return S_OK; 1634 } 1635 1636 // Done with file handle... 948 1637 CloseHandle(hFile); 949 return S_OK; 950 } 951 952 // Done with file handle... 953 CloseHandle(hFile); 954 955 HINSTANCE hInst; 1638 } 1639 else 1640 { 1641 // Failed to open file - Check to see if this is a request for a given resource 1642 HRSRC hRsrc; 1643 HGLOBAL hData; 1644 char * szLibName = HEAP_strdupA(m_hHeap, 0, szFile); 1645 char * p = strrchr(szLibName, '\\'); 1646 ULONG lResId; 1647 1648 if (p) 1649 { 1650 // Filename of form {drive:}{\\path\\}file\\resid 1651 *p = 0; 1652 lResId = atoi(p + 1); 1653 hInst = CoLoadLibrary(szLibName, TRUE); 1654 HeapFree(m_hHeap, 0, szLibName); 1655 if (hInst != 0) 1656 { 1657 HRSRC hRsrc; 1658 HGLOBAL hData; 1659 1660 if ((hRsrc = FindResourceA(hInst, (LPTSTR)lResId, "TYPELIB")) != 0) 1661 { 1662 hData = LoadResource(hInst, hRsrc); 1663 m_pTypeLib = LockResource(hData); 1664 return S_OK; 1665 } 1666 return E_FAIL; 1667 } 1668 } 1669 HeapFree(m_hHeap, 0, szLibName); 1670 } 956 1671 957 1672 // Check to see if this is a module... … … 959 1674 if (hInst) 960 1675 { 961 // Yup - use EnumResourceNames to locate & load resource. 962 EnumResourceNamesA(hInst, "TYPELIB", LoadSub, (LONG)&m_pTypeLib); 963 } 964 965 if (!m_pTypeLib) 966 { 967 dprintf((" No TYPELIB resources found...")); 968 return E_FAIL; 969 } 970 971 return S_OK; 972 } 973 974 // ---------------------------------------------------------------------- 975 // TypeLibExtract::DumpHeader 976 // 977 // Drop a debug print of the header content to the ODIN log. 978 // ---------------------------------------------------------------------- 979 void TypeLibExtract::DumpHeader() 980 { 981 dprintf(("TYPELIB HEADER:")); 982 if (m_fValid) 983 { 984 dprintf((" Magic1 - 0x%08lx", m_pHeader->magic1)); 985 dprintf((" Magic2 - 0x%08lx", m_pHeader->magic2)); 986 dprintf((" posguid - 0x%08lx", m_pHeader->posguid)); 987 dprintf((" lcid - 0x%08lx", m_pHeader->lcid)); 988 dprintf((" lcid2 - 0x%08lx", m_pHeader->lcid2)); 989 dprintf((" varflags - 0x%08lx", m_pHeader->varflags)); 990 dprintf((" version - 0x%08lx", m_pHeader->version)); 991 dprintf((" flags - 0x%08lx", m_pHeader->flags)); 992 dprintf((" nrtypeinfos - 0x%08lx", m_pHeader->nrtypeinfos)); 993 dprintf((" helpstring - 0x%08lx", m_pHeader->helpstring)); 994 dprintf((" helpstringcontext - 0x%08lx", m_pHeader->helpstringcontext)); 995 dprintf((" helpcontext - 0x%08lx", m_pHeader->helpcontext)); 996 dprintf((" nametablecount - 0x%08lx", m_pHeader->nametablecount)); 997 dprintf((" nametablechars - 0x%08lx", m_pHeader->nametablechars)); 998 dprintf((" nameoffset - 0x%08lx", m_pHeader->nameOffset)); 999 dprintf((" helpfile - 0x%08lx", m_pHeader->helpfile)); 1000 dprintf((" custdataoffset - 0x%08lx", m_pHeader->customDataOffset)); 1001 dprintf((" res44 - 0x%08lx", m_pHeader->res44)); 1002 dprintf((" res48 - 0x%08lx", m_pHeader->res48)); 1003 dprintf((" dispatchpos - 0x%08lx", m_pHeader->dispatchpos)); 1004 dprintf((" res50 - 0x%08lx", m_pHeader->res50)); 1005 } 1006 else 1007 { 1008 dprintf((" INVALID")); 1009 } 1676 loadData.cLibs = 1; 1677 loadData.ppLib = &m_pTypeLib; 1678 // Yup - use EnumResourceNames to locate & load 1st resource. 1679 EnumResourceNamesA(hInst, "TYPELIB", LoadSub, (LONG)&loadData); 1680 return m_pTypeLib ? S_OK : E_FAIL; 1681 } 1682 1683 return E_FAIL; 1010 1684 } 1011 1685 … … 1015 1689 HRESULT TypeLibExtract::MakeITypeLib(ITypeLibImpl * * ppObject) 1016 1690 { 1017 dprintf(( "OLEAUT32:TypeLibExtract::MakeITypeLib"));1691 dprintf((LOG, "TypeLibExtract::MakeITypeLib")); 1018 1692 1019 1693 HRESULT rc; … … 1042 1716 { 1043 1717 1044 dprintf(("OLEAUT32: TypeLibExtract::Parse")); 1718 dprintf((LOG, "TypeLibExtract::Parse")); 1719 1720 // name, eventually add to a hash table 1721 ParseName(m_pHeader->nameOffset, &m_pITypeLib->szName); 1045 1722 1046 1723 // Load header info... … … 1052 1729 m_pITypeLib->LibAttr.wMinorVerNum = HIWORD(m_pHeader->version); 1053 1730 m_pITypeLib->LibAttr.wLibFlags = (WORD) m_pHeader->flags & 0xffff; /* check mask */ 1054 1055 // name, eventually add to a hash table1056 ParseName(m_pHeader->nameOffset, &m_pITypeLib->szName);1057 dprintf((" reading library: \"%s\"", m_pITypeLib->szName));1058 1731 1059 1732 // help info … … 1063 1736 if (m_pHelpStringOff) 1064 1737 ParseString(*m_pHelpStringOff, &m_pITypeLib->szHelpStringDll); 1738 1739 #if defined(DEBUG) 1740 1741 dprintfLine2(); 1742 dprintf((LOG, "Library: \"%s\"", m_pITypeLib->szName)); 1743 char guid[128]; 1744 WINE_StringFromCLSID(&m_pITypeLib->LibAttr.guid, guid); 1745 dprintf((LOG, " .GUID: %s", guid)); 1746 dprintf((LOG, " .lcid: %08x", m_pITypeLib->LibAttr.lcid)); 1747 dprintf((LOG, " .syskind: %08x", m_pITypeLib->LibAttr.syskind)); 1748 dprintf((LOG, " .MajorVer: %08x", m_pITypeLib->LibAttr.wMajorVerNum)); 1749 dprintf((LOG, " .MinorVer: %08x", m_pITypeLib->LibAttr.wMinorVerNum)); 1750 dprintf((LOG, " .LibFlags: %08x", m_pITypeLib->LibAttr.wLibFlags)); 1751 1752 #endif 1065 1753 1066 1754 // Load Custom data … … 1083 1771 { 1084 1772 pNew = new TYPEDESC; 1773 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 1085 1774 m_pITypeLib->pTypedesc.AddAtEnd(pNew); 1086 1775 } … … 1092 1781 1093 1782 pNew->vt = pTd->rec0 & VT_TYPEMASK; 1094 if ( (pNew->vt == VT_PTR) || (pNew->vt == VT_SAFEARRAY))1783 if (pNew->vt == VT_PTR) 1095 1784 { 1096 if (pTd->rec3 < 0) 1785 // >< 99.12.18 DJR Changed test 1786 if ((pTd->rec3 & 0x8000)) 1097 1787 V_UNION(pNew, lptdesc) = &stndTypeDesc[pTd->rec2]; 1098 1788 else 1099 V_UNION(pNew, lptdesc) = m_pITypeLib->pTypedesc[pTd->rec3 / 8]; 1789 V_UNION(pNew, lptdesc) = m_pITypeLib->pTypedesc[pTd->rec2 / 8]; 1790 } 1791 if (pNew->vt == VT_SAFEARRAY) 1792 { 1793 dprintf((LOG, "VT_SAFEARRAY - NIY")); 1100 1794 } 1101 1795 else if (pNew->vt == VT_CARRAY) … … 1126 1820 V_UNION(pNew, hreftype) = MAKELONG(pTd->rec2, pTd->rec3); 1127 1821 } 1822 1823 #if defined(DEBUG) 1824 dprintfLine2(); 1825 dprintf((LOG, "TypeDesc: %i", ii)); 1826 char buf[1024]; 1827 sprintfTypeDesc(buf, pNew); 1828 dprintf((LOG, " desc %s", buf)); 1829 dprintf((LOG, " pTd->rec0: %04x", pTd->rec0)); 1830 dprintf((LOG, " pTd->rec1: %04x", pTd->rec1)); 1831 dprintf((LOG, " pTd->rec2: %04x", pTd->rec2)); 1832 dprintf((LOG, " pTd->rec3: %04x", pTd->rec3)); 1833 if (pNew->vt == VT_CARRAY) 1834 { 1835 dprintf((LOG, " pArray->rec0: %04x", pArray->rec0)); 1836 dprintf((LOG, " pArray->rec1: %04x", pArray->rec1)); 1837 dprintf((LOG, " pArray->rec2: %04x", pArray->rec2)); 1838 dprintf((LOG, " pArray->rec3: %04x", pArray->rec3)); 1839 } 1840 #endif 1128 1841 } 1129 1842 } … … 1141 1854 { 1142 1855 pNew = new TLBImpLib; 1856 memset(pNew, 0, sizeof(*pNew)); // Ensure that unset fields get nulled out. 1143 1857 pNew->offset = totLen; 1144 1858 … … 1159 1873 totLen += recLen; 1160 1874 pImpFile = (TLBImpFile *)((char *)pImpFile + recLen); 1875 #if defined(DEBUG) 1876 dprintfLine2(); 1877 dprintf((LOG, "ImpLib %i", pNew->offset)); 1878 char guid[128]; 1879 WINE_StringFromCLSID(&(pNew->guid), guid); 1880 dprintf((LOG, " .GUID: %s", guid)); 1881 dprintf((LOG, " .Name: %s", pNew->name)); 1882 #endif 1161 1883 } 1162 1884 }
Note:
See TracChangeset
for help on using the changeset viewer.