|
|
1.1 ! root 1: /* ! 2: * INSOBJ.C ! 3: * ! 4: * Implements the OleUIInsertObject function which invokes the complete ! 5: * Insert Object dialog. Makes use of the OleChangeIcon function in ! 6: * ICON.C. ! 7: * ! 8: * Copyright (c)1993 Microsoft Corporation, All Rights Reserved ! 9: */ ! 10: ! 11: #define STRICT 1 ! 12: #include "ole2ui.h" ! 13: #include <commdlg.h> ! 14: #include <memory.h> ! 15: #include <direct.h> ! 16: #include <malloc.h> ! 17: #include <dos.h> ! 18: #include "common.h" ! 19: #include "utility.h" ! 20: #include "icon.h" ! 21: #include "insobj.h" ! 22: #include "resimage.h" ! 23: #include "iconbox.h" ! 24: #include "geticon.h" ! 25: ! 26: #define IS_FILENAME_DELIM(c) ( (c) == '\\' || (c) == '/' || (c) == ':' ) ! 27: ! 28: /* ! 29: * OleUIInsertObject ! 30: * ! 31: * Purpose: ! 32: * Invokes the standard OLE Insert Object dialog box allowing the ! 33: * user to select an object source and classname as well as the option ! 34: * to display the object as itself or as an icon. ! 35: * ! 36: * Parameters: ! 37: * lpIO LPOLEUIINSERTOBJECT pointing to the in-out structure ! 38: * for this dialog. ! 39: * ! 40: * Return Value: ! 41: * UINT OLEUI_SUCCESS or OLEUI_OK if all is well, otherwise ! 42: * an error value. ! 43: */ ! 44: ! 45: STDAPI_(UINT) OleUIInsertObject(LPOLEUIINSERTOBJECT lpIO) ! 46: { ! 47: UINT uRet; ! 48: HGLOBAL hMemDlg=NULL; ! 49: HRESULT hrErr; ! 50: ! 51: uRet=UStandardValidation((LPOLEUISTANDARD)lpIO, sizeof(OLEUIINSERTOBJECT) ! 52: , &hMemDlg); ! 53: ! 54: if (OLEUI_SUCCESS!=uRet) ! 55: return uRet; ! 56: ! 57: //Now we can do Insert Object specific validation. ! 58: ! 59: ! 60: // NULL is NOT valid for lpszFile ! 61: if ( (NULL == lpIO->lpszFile) ! 62: || (IsBadReadPtr(lpIO->lpszFile, lpIO->cchFile)) ! 63: || (IsBadWritePtr(lpIO->lpszFile, lpIO->cchFile)) ) ! 64: uRet=OLEUI_IOERR_LPSZFILEINVALID; ! 65: ! 66: if (NULL != lpIO->lpszFile ! 67: && (lpIO->cchFile <= 0 || lpIO->cchFile > OLEUI_CCHPATHMAX)) ! 68: uRet=OLEUI_IOERR_CCHFILEINVALID; ! 69: ! 70: if (0!=lpIO->cClsidExclude) ! 71: { ! 72: if (NULL!=lpIO->lpClsidExclude && IsBadReadPtr(lpIO->lpClsidExclude ! 73: , lpIO->cClsidExclude*sizeof(CLSID))) ! 74: uRet=OLEUI_IOERR_LPCLSIDEXCLUDEINVALID; ! 75: } ! 76: ! 77: //If we have flags to create any object, validate necessary data. ! 78: if (lpIO->dwFlags & (IOF_CREATENEWOBJECT | IOF_CREATEFILEOBJECT | IOF_CREATELINKOBJECT)) ! 79: { ! 80: if (NULL!=lpIO->lpFormatEtc ! 81: && IsBadReadPtr(lpIO->lpFormatEtc, sizeof(FORMATETC))) ! 82: uRet=OLEUI_IOERR_LPFORMATETCINVALID; ! 83: ! 84: if (NULL!=lpIO->ppvObj && IsBadWritePtr(lpIO->ppvObj, sizeof(LPVOID))) ! 85: uRet=OLEUI_IOERR_PPVOBJINVALID; ! 86: ! 87: if (NULL!=lpIO->lpIOleClientSite ! 88: && IsBadReadPtr(lpIO->lpIOleClientSite->lpVtbl, sizeof(IOleClientSiteVtbl))) ! 89: uRet=OLEUI_IOERR_LPIOLECLIENTSITEINVALID; ! 90: ! 91: if (NULL!=lpIO->lpIStorage ! 92: && IsBadReadPtr(lpIO->lpIStorage->lpVtbl, sizeof(IStorageVtbl))) ! 93: uRet=OLEUI_IOERR_LPISTORAGEINVALID; ! 94: } ! 95: ! 96: if (OLEUI_ERR_STANDARDMIN <= uRet) ! 97: { ! 98: if (NULL!=hMemDlg) ! 99: FreeResource(hMemDlg); ! 100: ! 101: return uRet; ! 102: } ! 103: ! 104: //Now that we've validated everything, we can invoke the dialog. ! 105: uRet=UStandardInvocation(InsertObjectDialogProc, (LPOLEUISTANDARD)lpIO ! 106: , hMemDlg, MAKEINTRESOURCE(IDD_INSERTOBJECT)); ! 107: ! 108: ! 109: //Stop here if we cancelled or had an error. ! 110: if (OLEUI_SUCCESS !=uRet && OLEUI_OK!=uRet) ! 111: return uRet; ! 112: ! 113: ! 114: /* ! 115: * If any of the flags specify that we're to create objects on return ! 116: * from this dialog, then do so. If we encounter an error in this ! 117: * processing, we return OLEUI_IOERR_SCODEHASERROR. Since the ! 118: * three select flags are mutually exclusive, we don't have to ! 119: * if...else here, just if each case (keeps things cleaner that way). ! 120: */ ! 121: ! 122: lpIO->sc=S_OK; ! 123: ! 124: //Check if Create New was selected and we have IOF_CREATENEWOBJECT ! 125: if ((lpIO->dwFlags & IOF_SELECTCREATENEW) && (lpIO->dwFlags & IOF_CREATENEWOBJECT)) ! 126: { ! 127: hrErr=OleCreate(&lpIO->clsid, &lpIO->iid, lpIO->oleRender ! 128: , lpIO->lpFormatEtc, lpIO->lpIOleClientSite, lpIO->lpIStorage ! 129: , lpIO->ppvObj); ! 130: lpIO->sc = GetScode(hrErr); ! 131: } ! 132: ! 133: //Try Create From File ! 134: if ((lpIO->dwFlags & IOF_SELECTCREATEFROMFILE)) ! 135: { ! 136: if (!(lpIO->dwFlags & IOF_CHECKLINK) && (lpIO->dwFlags & IOF_CREATEFILEOBJECT)) ! 137: { ! 138: hrErr=OleCreateFromFile(&CLSID_NULL, lpIO->lpszFile, &lpIO->iid ! 139: , lpIO->oleRender, lpIO->lpFormatEtc, lpIO->lpIOleClientSite ! 140: , lpIO->lpIStorage, lpIO->ppvObj); ! 141: lpIO->sc = GetScode(hrErr); ! 142: } ! 143: ! 144: if ((lpIO->dwFlags & IOF_CHECKLINK) && (lpIO->dwFlags & IOF_CREATELINKOBJECT)) ! 145: { ! 146: hrErr=OleCreateLinkToFile(lpIO->lpszFile, &lpIO->iid ! 147: , lpIO->oleRender, lpIO->lpFormatEtc, lpIO->lpIOleClientSite ! 148: , lpIO->lpIStorage, lpIO->ppvObj); ! 149: lpIO->sc = GetScode(hrErr); ! 150: } ! 151: } ! 152: ! 153: //If we tried but failed a create option, then return the appropriate error ! 154: if (S_OK!=lpIO->sc) ! 155: uRet=OLEUI_IOERR_SCODEHASERROR; ! 156: ! 157: return uRet; ! 158: } ! 159: ! 160: ! 161: ! 162: ! 163: ! 164: /* ! 165: * InsertObjectDialogProc ! 166: * ! 167: * Purpose: ! 168: * Implements the OLE Insert Object dialog as invoked through the ! 169: * OleUIInsertObject function. ! 170: */ ! 171: ! 172: BOOL CALLBACK EXPORT InsertObjectDialogProc(HWND hDlg, UINT iMsg ! 173: , WPARAM wParam, LPARAM lParam) ! 174: { ! 175: LPOLEUIINSERTOBJECT lpOIO; ! 176: LPINSERTOBJECT lpIO; ! 177: OLEUICHANGEICON ci; ! 178: UINT i; ! 179: BOOL fCheck=FALSE; ! 180: UINT uRet=0; ! 181: ! 182: //Declare Win16/Win32 compatible WM_COMMAND parameters. ! 183: COMMANDPARAMS(wID, wCode, hWndMsg); ! 184: ! 185: //This will fail under WM_INITDIALOG, where we allocate it. ! 186: lpIO=(LPINSERTOBJECT)LpvStandardEntry(hDlg, iMsg, wParam, lParam, &uRet); ! 187: ! 188: //If the hook processed the message, we're done. ! 189: if (0!=uRet) ! 190: return (BOOL)uRet; ! 191: ! 192: //Process help message from Change Icon ! 193: if (iMsg==uMsgHelp) ! 194: { ! 195: PostMessage(lpIO->lpOIO->hWndOwner, uMsgHelp, wParam, lParam); ! 196: return FALSE; ! 197: } ! 198: ! 199: //Process the temination message ! 200: if (iMsg==uMsgEndDialog) ! 201: { ! 202: InsertObjectCleanup(hDlg); ! 203: StandardCleanup(lpIO, hDlg); ! 204: EndDialog(hDlg, wParam); ! 205: return TRUE; ! 206: } ! 207: ! 208: switch (iMsg) ! 209: { ! 210: case WM_INITDIALOG: ! 211: return FInsertObjectInit(hDlg, wParam, lParam); ! 212: ! 213: case WM_COMMAND: ! 214: switch (wID) ! 215: { ! 216: case ID_IO_CREATENEW: ! 217: FToggleObjectSource(hDlg, lpIO, IOF_SELECTCREATENEW); ! 218: break; ! 219: ! 220: case ID_IO_CREATEFROMFILE: ! 221: FToggleObjectSource(hDlg, lpIO, IOF_SELECTCREATEFROMFILE); ! 222: break; ! 223: ! 224: case ID_IO_LINKFILE: ! 225: fCheck=IsDlgButtonChecked(hDlg, wID); ! 226: ! 227: if (fCheck) ! 228: lpIO->dwFlags |=IOF_CHECKLINK; ! 229: else ! 230: lpIO->dwFlags &=~IOF_CHECKLINK; ! 231: ! 232: //Results change here, so be sure to update it. ! 233: SetInsertObjectResults(hDlg, lpIO); ! 234: UpdateClassIcon(hDlg, lpIO, NULL); ! 235: break; ! 236: ! 237: case ID_IO_OBJECTTYPELIST: ! 238: switch (wCode) ! 239: { ! 240: case LBN_SELCHANGE: ! 241: UpdateClassIcon(hDlg, lpIO, hWndMsg); ! 242: SetInsertObjectResults(hDlg, lpIO); ! 243: break; ! 244: ! 245: case LBN_DBLCLK: ! 246: //Same as pressing OK. ! 247: SendCommand(hDlg, IDOK, BN_CLICKED, hWndMsg); ! 248: break; ! 249: } ! 250: break; ! 251: ! 252: ! 253: case ID_IO_FILEDISPLAY: ! 254: //If there are characters, enable OK and Display As Icon ! 255: if (EN_CHANGE==wCode) ! 256: { ! 257: lpIO->fFileDirty = TRUE; ! 258: lpIO->fFileValid = FALSE; ! 259: ! 260: lpIO->fFileSelected= ! 261: (0L!=SendMessage(hWndMsg, EM_LINELENGTH, 0, 0L)); ! 262: EnableWindow(GetDlgItem(hDlg, ID_IO_LINKFILE), lpIO->fFileSelected); ! 263: EnableWindow(GetDlgItem(hDlg, ID_IO_DISPLAYASICON), lpIO->fFileSelected); ! 264: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), lpIO->fFileSelected); ! 265: EnableWindow(GetDlgItem(hDlg, IDOK), lpIO->fFileSelected); ! 266: } ! 267: ! 268: if (EN_KILLFOCUS==wCode && NULL!=lpIO) ! 269: { ! 270: if (FValidateInsertFile(hDlg,FALSE,&lpIO->nErrCode)) { ! 271: lpIO->fFileDirty = FALSE; ! 272: lpIO->fFileValid = TRUE; ! 273: UpdateClassIcon(hDlg, lpIO, NULL); ! 274: UpdateClassType(hDlg, lpIO, TRUE); ! 275: } else { ! 276: lpIO->fFileDirty = FALSE; ! 277: lpIO->fFileValid = FALSE; ! 278: UpdateClassType(hDlg, lpIO, FALSE); ! 279: } ! 280: } ! 281: break; ! 282: ! 283: ! 284: case ID_IO_DISPLAYASICON: ! 285: fCheck=IsDlgButtonChecked(hDlg, wID); ! 286: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), fCheck); ! 287: ! 288: if (fCheck) ! 289: lpIO->dwFlags |=IOF_CHECKDISPLAYASICON; ! 290: else ! 291: lpIO->dwFlags &=~IOF_CHECKDISPLAYASICON; ! 292: ! 293: //Update the internal flag based on this checking ! 294: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 295: lpIO->fAsIconNew=fCheck; ! 296: else ! 297: lpIO->fAsIconFile=fCheck; ! 298: ! 299: //Re-read the class icon on Display checked ! 300: if (fCheck) ! 301: { ! 302: if (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE) ! 303: { ! 304: if (FValidateInsertFile(hDlg, TRUE,&lpIO->nErrCode)) ! 305: { ! 306: lpIO->fFileDirty = FALSE; ! 307: lpIO->fFileValid = TRUE; ! 308: UpdateClassIcon(hDlg, lpIO, ! 309: GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST)); ! 310: ! 311: UpdateClassType(hDlg, lpIO, TRUE); ! 312: } ! 313: ! 314: else ! 315: { ! 316: HWND hWndEC; ! 317: ! 318: lpIO->fAsIconFile= FALSE; ! 319: lpIO->fFileDirty = FALSE; ! 320: lpIO->fFileValid = FALSE; ! 321: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, 0, 0L); ! 322: UpdateClassType(hDlg, lpIO, FALSE); ! 323: ! 324: lpIO->dwFlags &=~IOF_CHECKDISPLAYASICON; ! 325: CheckDlgButton(hDlg, ID_IO_DISPLAYASICON, 0); ! 326: ! 327: hWndEC = GetDlgItem(hDlg, ID_IO_FILEDISPLAY); ! 328: SetFocus(hWndEC); ! 329: SendMessage(hWndEC, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1)); ! 330: return TRUE; ! 331: } ! 332: } ! 333: else ! 334: UpdateClassIcon(hDlg, lpIO, ! 335: GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST)); ! 336: } ! 337: ! 338: ! 339: //Results change here, so be sure to update it. ! 340: SetInsertObjectResults(hDlg, lpIO); ! 341: ! 342: ! 343: /* ! 344: * Show or hide controls as appropriate. Do the icon ! 345: * display last because it will take some time to repaint. ! 346: * If we do it first then the dialog looks too sluggish. ! 347: */ ! 348: i=(fCheck) ? SW_SHOWNORMAL : SW_HIDE; ! 349: StandardShowDlgItem(hDlg, ID_IO_CHANGEICON, i); ! 350: StandardShowDlgItem(hDlg, ID_IO_ICONDISPLAY, i); ! 351: ! 352: break; ! 353: ! 354: ! 355: case ID_IO_CHANGEICON: ! 356: { ! 357: ! 358: LPMALLOC pIMalloc; ! 359: HWND hList; ! 360: LPSTR pszString, pszCLSID; ! 361: ! 362: int iCurSel; ! 363: ! 364: // if we're in SELECTCREATEFROMFILE mode, then we need to Validate ! 365: // the contents of the edit control first. ! 366: ! 367: if (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE) ! 368: { ! 369: if ( lpIO->fFileDirty ! 370: && !FValidateInsertFile(hDlg, TRUE, &lpIO->nErrCode) ) ! 371: { ! 372: HWND hWndEC; ! 373: ! 374: lpIO->fFileDirty = TRUE; ! 375: hWndEC = GetDlgItem(hDlg, ID_IO_FILEDISPLAY); ! 376: SetFocus(hWndEC); ! 377: SendMessage(hWndEC, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1)); ! 378: return TRUE; ! 379: } ! 380: else ! 381: lpIO->fFileDirty = FALSE; ! 382: } ! 383: ! 384: ! 385: ! 386: //Initialize the structure for the hook. ! 387: _fmemset((LPOLEUICHANGEICON)&ci, 0, sizeof(ci)); ! 388: ! 389: ci.hMetaPict=(HGLOBAL)SendDlgItemMessage(hDlg ! 390: , ID_IO_ICONDISPLAY, IBXM_IMAGEGET, 0, 0L); ! 391: ! 392: ci.cbStruct =sizeof(ci); ! 393: ci.hWndOwner=hDlg; ! 394: ci.dwFlags =CIF_SELECTCURRENT; ! 395: ! 396: if (lpIO->dwFlags & IOF_SHOWHELP) ! 397: ci.dwFlags |= CIF_SHOWHELP; ! 398: ! 399: ! 400: ! 401: ! 402: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 403: { ! 404: // Initialize clsid... ! 405: if (NOERROR != CoGetMalloc(MEMCTX_TASK, &pIMalloc)) ! 406: return FALSE; ! 407: ! 408: pszString = (LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX + OLEUI_CCHCLSIDSTRING); ! 409: ! 410: ! 411: hList = GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST); ! 412: iCurSel = (int)SendMessage(hList, LB_GETCURSEL, 0, 0L); ! 413: SendMessage(hList, LB_GETTEXT, iCurSel, (LONG)pszString); ! 414: ! 415: pszCLSID = PointerToNthField(pszString, 2, '\t'); ! 416: ! 417: CLSIDFromString((LPSTR)pszCLSID, (LPCLSID)&(ci.clsid)); ! 418: ! 419: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszString); ! 420: pIMalloc->lpVtbl->Release(pIMalloc); ! 421: } ! 422: else // IOF_SELECTCREATEFROMFILE ! 423: { ! 424: ! 425: char szFileName[OLEUI_CCHPATHMAX]; ! 426: ! 427: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, (LPSTR)szFileName, OLEUI_CCHPATHMAX); ! 428: ! 429: if (NOERROR != GetClassFile((LPSTR)szFileName, (LPCLSID)&(ci.clsid))) ! 430: { ! 431: LPSTR lpszExtension; ! 432: int istrlen; ! 433: ! 434: istrlen = lstrlen(szFileName); ! 435: ! 436: lpszExtension = (LPSTR)szFileName + istrlen -1; ! 437: ! 438: while ( (lpszExtension > szFileName) && ! 439: (*lpszExtension != '.') ) ! 440: lpszExtension--; ! 441: ! 442: GetAssociatedExecutable(lpszExtension, (LPSTR)ci.szIconExe); ! 443: ci.cchIconExe = lstrlen(ci.szIconExe); ! 444: ci.dwFlags |= CIF_USEICONEXE; ! 445: ! 446: } ! 447: } ! 448: ! 449: ! 450: //Let the hook in to customize Change Icon if desired. ! 451: uRet=UStandardHook(lpIO, hDlg, uMsgChangeIcon ! 452: , 0, (LONG)(LPSTR)&ci); ! 453: ! 454: if (0==uRet) ! 455: uRet=(UINT)(OLEUI_OK==OleUIChangeIcon(&ci)); ! 456: ! 457: //Update the display and itemdata if necessary. ! 458: if (0!=uRet) ! 459: { ! 460: ! 461: /* ! 462: * OleUIChangeIcon will have already freed our ! 463: * current hMetaPict that we passed in when OK is ! 464: * pressed in that dialog. So we use 0L as lParam ! 465: * here so the IconBox doesn't try to free the ! 466: * metafilepict again. ! 467: */ ! 468: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET ! 469: , (WPARAM)ci.hMetaPict, 0L); ! 470: ! 471: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 472: SendMessage(hList, LB_SETITEMDATA, iCurSel, MAKELPARAM(ci.hMetaPict, 0)); ! 473: } ! 474: } ! 475: break; ! 476: ! 477: ! 478: case ID_IO_FILE: ! 479: { ! 480: /* ! 481: * To allow the hook to customize the browse dialog, we ! 482: * send OLEUI_MSG_BROWSE. If the hook returns FALSE ! 483: * we use the default, otherwise we trust that it retrieved ! 484: * a filename for us. This mechanism prevents hooks from ! 485: * trapping ID_IO_BROWSE to customize the dialog and from ! 486: * trying to figure out what we do after we have the name. ! 487: */ ! 488: ! 489: char szTemp[OLEUI_CCHPATHMAX]; ! 490: char szInitialDir[OLEUI_CCHPATHMAX]; ! 491: DWORD dwOfnFlags; ! 492: int nChars; ! 493: BOOL fUseInitialDir = FALSE; ! 494: ! 495: ! 496: nChars = GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, (LPSTR)szTemp, OLEUI_CCHPATHMAX); ! 497: ! 498: if (FValidateInsertFile(hDlg, FALSE, &lpIO->nErrCode)) ! 499: { ! 500: ! 501: int istrlen; ! 502: ! 503: GetFileTitle((LPSTR)szTemp, lpIO->szFile, OLEUI_CCHPATHMAX); ! 504: ! 505: istrlen = lstrlen(lpIO->szFile); ! 506: ! 507: lstrcpyn((LPSTR)szInitialDir, szTemp, nChars - istrlen); ! 508: fUseInitialDir = TRUE; ! 509: ! 510: } ! 511: else // file name isn't valid...lop off end of szTemp to get a ! 512: // valid directory ! 513: { ! 514: #if defined( WIN32 ) ! 515: char szBuffer[OLEUI_CCHPATHMAX]; ! 516: DWORD Attribs; ! 517: ! 518: lstrcpyn(szBuffer, szTemp, sizeof(szBuffer)-1); ! 519: szBuffer[sizeof(szBuffer)-1] = '\0'; ! 520: ! 521: if ('\\' == szBuffer[nChars-1]) ! 522: szBuffer[nChars-1] = '\0'; ! 523: ! 524: Attribs = GetFileAttributes(szBuffer); ! 525: if (Attribs != 0xffffffff && ! 526: (Attribs & FILE_ATTRIBUTE_DIRECTORY) ) ! 527: { ! 528: lstrcpy(szInitialDir, (LPSTR)szBuffer); ! 529: fUseInitialDir = TRUE; ! 530: } ! 531: #else ! 532: static char szBuffer[OLEUI_CCHPATHMAX]; ! 533: static int attrib ; ! 534: ! 535: lstrcpyn(szBuffer, szTemp, sizeof(szBuffer)-1); ! 536: szBuffer[sizeof(szBuffer)-1] = '\0'; ! 537: ! 538: if ('\\' == szBuffer[nChars-1]) ! 539: szBuffer[nChars-1] = '\0'; ! 540: ! 541: AnsiToOem(szBuffer, szBuffer); ! 542: if(0 == _dos_getfileattr(szBuffer, &attrib)) ! 543: { ! 544: lstrcpy(szInitialDir, (LPSTR)szBuffer); ! 545: fUseInitialDir = TRUE; ! 546: } ! 547: #endif ! 548: *lpIO->szFile = '\0'; ! 549: } ! 550: ! 551: uRet=UStandardHook(lpIO, hDlg, uMsgBrowse ! 552: , OLEUI_CCHPATHMAX, (LPARAM)(LPSTR)lpIO->szFile); ! 553: ! 554: dwOfnFlags = OFN_FILEMUSTEXIST; ! 555: ! 556: // dont show the help button: easiest fix for #4567, since there is no hook proc ! 557: // if (lpIO->lpOIO->dwFlags & IOF_SHOWHELP) ! 558: // dwOfnFlags |= OFN_SHOWHELP; ! 559: ! 560: if (0==uRet) ! 561: uRet=(UINT)Browse(hDlg, ! 562: lpIO->szFile, ! 563: fUseInitialDir ? (LPSTR)szInitialDir : NULL, ! 564: OLEUI_CCHPATHMAX, ! 565: IDS_FILTERS, ! 566: dwOfnFlags); ! 567: ! 568: //Only update if the file changed. ! 569: if (0!=uRet && 0!=lstrcmpi(szTemp, lpIO->szFile)) ! 570: { ! 571: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, lpIO->szFile); ! 572: lpIO->fFileSelected=TRUE; ! 573: ! 574: if (FValidateInsertFile(hDlg, TRUE, &lpIO->nErrCode)) ! 575: { ! 576: lpIO->fFileDirty = FALSE; ! 577: lpIO->fFileValid = TRUE; ! 578: UpdateClassIcon(hDlg, lpIO, NULL); ! 579: UpdateClassType(hDlg, lpIO, TRUE); ! 580: } ! 581: else // filename is invalid - set focus back to ec ! 582: { ! 583: HWND hWnd; ! 584: ! 585: lpIO->fFileDirty = FALSE; ! 586: lpIO->fFileValid = FALSE; ! 587: hWnd = GetDlgItem(hDlg, ID_IO_FILEDISPLAY); ! 588: SetFocus(hWnd); ! 589: SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1)); ! 590: } ! 591: ! 592: //Once we have a file, Display As Icon is always enabled ! 593: EnableWindow(GetDlgItem(hDlg, ID_IO_DISPLAYASICON), TRUE); ! 594: ! 595: //As well as OK ! 596: EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); ! 597: ! 598: } ! 599: } ! 600: break; ! 601: ! 602: ! 603: case IDOK: ! 604: { ! 605: HWND hListBox; ! 606: WORD iCurSel; ! 607: char szBuffer[OLEUI_CCHKEYMAX + OLEUI_CCHCLSIDSTRING]; ! 608: LPSTR lpszCLSID; ! 609: ! 610: if ((HWND)(LOWORD(lParam)) != GetFocus()) ! 611: SetFocus((HWND)(LOWORD(lParam))); ! 612: ! 613: ! 614: ! 615: // If the file name is clean (already validated), or ! 616: // if Create New is selected, then we can skip this part. ! 617: ! 618: if ( (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE) ! 619: && (TRUE == lpIO->fFileDirty) ) ! 620: { ! 621: ! 622: if (FValidateInsertFile(hDlg, TRUE, &lpIO->nErrCode)) ! 623: { ! 624: lpIO->fFileDirty = FALSE; ! 625: lpIO->fFileValid = TRUE; ! 626: UpdateClassIcon(hDlg, lpIO, NULL); ! 627: UpdateClassType(hDlg, lpIO, TRUE); ! 628: } ! 629: else // filename is invalid - set focus back to ec ! 630: { ! 631: HWND hWnd; ! 632: ! 633: lpIO->fFileDirty = FALSE; ! 634: lpIO->fFileValid = FALSE; ! 635: hWnd = GetDlgItem(hDlg, ID_IO_FILEDISPLAY); ! 636: SetFocus(hWnd); ! 637: SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1)); ! 638: UpdateClassType(hDlg, lpIO, FALSE); ! 639: } ! 640: ! 641: return TRUE; // eat this message ! 642: } ! 643: else if ( (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE) ! 644: && (FALSE == lpIO->fFileValid) ) ! 645: { ! 646: // filename is invalid - set focus back to ec ! 647: HWND hWnd; ! 648: char szFile[OLEUI_CCHPATHMAX]; ! 649: ! 650: if (0!=GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, ! 651: szFile, sizeof(szFile))) ! 652: { ! 653: OpenFileError(hDlg, lpIO->nErrCode, szFile); ! 654: } ! 655: lpIO->fFileDirty = FALSE; ! 656: lpIO->fFileValid = FALSE; ! 657: hWnd = GetDlgItem(hDlg, ID_IO_FILEDISPLAY); ! 658: SetFocus(hWnd); ! 659: SendMessage(hWnd, EM_SETSEL, 0, MAKELPARAM(0, (WORD)-1)); ! 660: UpdateClassType(hDlg, lpIO, FALSE); ! 661: return TRUE; // eat this message ! 662: } ! 663: ! 664: //Copy the necessary information back to the original struct ! 665: lpOIO=lpIO->lpOIO; ! 666: lpOIO->dwFlags=lpIO->dwFlags; ! 667: ! 668: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 669: { ! 670: hListBox=GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST); ! 671: iCurSel=(WORD)SendMessage(hListBox, LB_GETCURSEL, 0, 0); ! 672: ! 673: if (lpIO->dwFlags & IOF_CHECKDISPLAYASICON) ! 674: { ! 675: lpOIO->hMetaPict=(HGLOBAL)SendMessage(hListBox, ! 676: LB_GETITEMDATA, iCurSel, 0L); ! 677: ! 678: /* ! 679: * Set the item data to 0 here so that the cleanup ! 680: * code doesn't delete the metafile. ! 681: */ ! 682: SendMessage(hListBox, LB_SETITEMDATA, iCurSel, 0L); ! 683: } ! 684: else ! 685: lpOIO->hMetaPict = (HGLOBAL)NULL; ! 686: ! 687: SendMessage(hListBox, LB_GETTEXT, iCurSel ! 688: , (LPARAM)(LPSTR)szBuffer); ! 689: ! 690: lpszCLSID=PointerToNthField((LPSTR)szBuffer, 2, '\t'); ! 691: CLSIDFromString(lpszCLSID, &lpOIO->clsid); ! 692: ! 693: } ! 694: else // IOF_SELECTCREATEFROMFILE ! 695: { ! 696: if (lpIO->dwFlags & IOF_CHECKDISPLAYASICON) ! 697: { ! 698: // get metafile here ! 699: lpOIO->hMetaPict = (HGLOBAL)SendDlgItemMessage(hDlg, ! 700: ID_IO_ICONDISPLAY, ! 701: IBXM_IMAGEGET, ! 702: 0, 0L); ! 703: ! 704: ! 705: } ! 706: else ! 707: lpOIO->hMetaPict = (HGLOBAL)NULL; ! 708: ! 709: } ! 710: ! 711: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, ! 712: lpIO->szFile, lpOIO->cchFile); ! 713: ! 714: lstrcpyn(lpOIO->lpszFile, lpIO->szFile, lpOIO->cchFile); ! 715: ! 716: SendMessage(hDlg, uMsgEndDialog, OLEUI_OK, 0L); ! 717: } ! 718: break; ! 719: ! 720: case IDCANCEL: ! 721: SendMessage(hDlg, uMsgEndDialog, OLEUI_CANCEL, 0L); ! 722: break; ! 723: ! 724: case ID_OLEUIHELP: ! 725: PostMessage(lpIO->lpOIO->hWndOwner, uMsgHelp ! 726: , (WPARAM)hDlg, MAKELPARAM(IDD_INSERTOBJECT, 0)); ! 727: break; ! 728: } ! 729: break; ! 730: } ! 731: ! 732: return FALSE; ! 733: } ! 734: ! 735: ! 736: ! 737: ! 738: /* ! 739: * FInsertObjectInit ! 740: * ! 741: * Purpose: ! 742: * WM_INITIDIALOG handler for the Insert Object dialog box. ! 743: * ! 744: * Parameters: ! 745: * hDlg HWND of the dialog ! 746: * wParam WPARAM of the message ! 747: * lParam LPARAM of the message ! 748: * ! 749: * Return Value: ! 750: * BOOL Value to return for WM_INITDIALOG. ! 751: */ ! 752: ! 753: BOOL FInsertObjectInit(HWND hDlg, WPARAM wParam, LPARAM lParam) ! 754: { ! 755: LPOLEUIINSERTOBJECT lpOIO; ! 756: LPINSERTOBJECT lpIO; ! 757: RECT rc; ! 758: DWORD dw; ! 759: HFONT hFont; ! 760: HWND hList; ! 761: UINT u; ! 762: BOOL fCheck; ! 763: char *pch; ! 764: ! 765: //1. Copy the structure at lParam into our instance memory. ! 766: lpIO=(LPINSERTOBJECT)LpvStandardInit(hDlg, sizeof(INSERTOBJECT), TRUE, &hFont); ! 767: ! 768: //PvStandardInit send a termination to us already. ! 769: if (NULL==lpIO) ! 770: return FALSE; ! 771: ! 772: lpOIO=(LPOLEUIINSERTOBJECT)lParam; ! 773: ! 774: //2. Save the original pointer and copy necessary information. ! 775: lpIO->lpOIO =lpOIO; ! 776: lpIO->dwFlags=lpOIO->dwFlags; ! 777: lpIO->clsid =lpOIO->clsid; ! 778: ! 779: if ( (lpOIO->lpszFile) && ('\0' != *lpOIO->lpszFile) ) ! 780: lstrcpyn((LPSTR)lpIO->szFile, lpOIO->lpszFile, OLEUI_CCHPATHMAX); ! 781: else ! 782: *(lpIO->szFile) = '\0'; ! 783: ! 784: lpIO->hMetaPictFile = (HGLOBAL)NULL; ! 785: ! 786: //3. If we got a font, send it to the necessary controls. ! 787: if (NULL!=hFont) ! 788: { ! 789: SendDlgItemMessage(hDlg, ID_IO_RESULTTEXT, WM_SETFONT, (WPARAM)hFont, 0L); ! 790: SendDlgItemMessage(hDlg, ID_IO_FILETYPE, WM_SETFONT, (WPARAM)hFont, 0L); ! 791: } ! 792: ! 793: ! 794: //4. Fill the Object Type listbox with entries from the reg DB. ! 795: hList=GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST); ! 796: UFillClassList(hList, lpOIO->cClsidExclude, lpOIO->lpClsidExclude ! 797: , (BOOL)(lpOIO->dwFlags & IOF_VERIFYSERVERSEXIST)); ! 798: ! 799: //Set the tab width in the list to push all the tabs off the side. ! 800: GetClientRect(hList, &rc); ! 801: dw=GetDialogBaseUnits(); ! 802: rc.right =(8*rc.right)/LOWORD(dw); //Convert pixels to 2x dlg units. ! 803: SendMessage(hList, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&rc.right); ! 804: ! 805: ! 806: //5. Initilize the file name display to cwd if we don't have any name. ! 807: if ('\0' == *(lpIO->szFile)) ! 808: { ! 809: pch=_getcwd(NULL, OLEUI_CCHPATHMAX); ! 810: if (*(pch+lstrlen(pch)-1) != '\\') ! 811: lstrcat(pch, "\\"); // put slash on end of cwd ! 812: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, pch); ! 813: lpIO->fFileDirty = TRUE; // cwd is not a valid filename ! 814: #ifndef __TURBOC__ ! 815: free(pch); ! 816: #endif ! 817: } ! 818: else ! 819: { ! 820: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, lpIO->szFile); ! 821: ! 822: if (FValidateInsertFile(hDlg, FALSE, &lpIO->nErrCode)) ! 823: lpIO->fFileDirty = FALSE; ! 824: else ! 825: lpIO->fFileDirty = TRUE; ! 826: } ! 827: ! 828: ! 829: //6. Initialize the selected type radiobutton. ! 830: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 831: { ! 832: StandardShowDlgItem(hDlg, ID_IO_FILETEXT, SW_HIDE); ! 833: StandardShowDlgItem(hDlg, ID_IO_FILETYPE, SW_HIDE); ! 834: StandardShowDlgItem(hDlg, ID_IO_FILEDISPLAY, SW_HIDE); ! 835: StandardShowDlgItem(hDlg, ID_IO_FILE, SW_HIDE); ! 836: StandardShowDlgItem(hDlg, ID_IO_LINKFILE, SW_HIDE); ! 837: ! 838: CheckRadioButton(hDlg, ID_IO_CREATENEW, ID_IO_CREATEFROMFILE, ID_IO_CREATENEW); ! 839: ! 840: lpIO->fAsIconNew=(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON)); ! 841: SetFocus(hList); ! 842: } ! 843: else ! 844: { ! 845: /* ! 846: * Use pszType as the initial File. If there's no initial ! 847: * file then we have to remove any check from Display As ! 848: * Icon. We also check Link if so indicated for this option. ! 849: */ ! 850: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPELIST, SW_HIDE); ! 851: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPETEXT, SW_HIDE); ! 852: ! 853: // Don't preselect display as icon if the filename isn't valid ! 854: if (TRUE == lpIO->fFileDirty) ! 855: lpIO->dwFlags &= ~(IOF_CHECKDISPLAYASICON); ! 856: ! 857: if (IOF_DISABLELINK & lpIO->dwFlags) ! 858: StandardShowDlgItem(hDlg, ID_IO_LINKFILE, SW_HIDE); ! 859: else ! 860: { ! 861: CheckDlgButton(hDlg, ID_IO_LINKFILE ! 862: , (BOOL)(0L!=(lpIO->dwFlags & IOF_CHECKLINK))); ! 863: } ! 864: ! 865: CheckRadioButton(hDlg, ID_IO_CREATENEW, ID_IO_CREATEFROMFILE, ID_IO_CREATEFROMFILE); ! 866: ! 867: lpIO->fAsIconFile=(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON)); ! 868: SetFocus(GetDlgItem(hDlg, ID_IO_FILEDISPLAY)); ! 869: } ! 870: ! 871: ! 872: //7. Initialize the Display as Icon state ! 873: fCheck=(BOOL)(lpIO->dwFlags & IOF_CHECKDISPLAYASICON); ! 874: u=fCheck ? SW_SHOWNORMAL : SW_HIDE; ! 875: ! 876: StandardShowDlgItem(hDlg, ID_IO_CHANGEICON, u); ! 877: StandardShowDlgItem(hDlg, ID_IO_ICONDISPLAY, u); ! 878: ! 879: CheckDlgButton(hDlg, ID_IO_DISPLAYASICON, fCheck); ! 880: ! 881: ! 882: //8. Show or hide the help button ! 883: if (!(lpIO->dwFlags & IOF_SHOWHELP)) ! 884: StandardShowDlgItem(hDlg, ID_OLEUIHELP, SW_HIDE); ! 885: ! 886: ! 887: //9. Initialize the result display ! 888: UpdateClassIcon(hDlg, lpIO, GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST)); ! 889: SetInsertObjectResults(hDlg, lpIO); ! 890: ! 891: //10. Change the caption ! 892: if (NULL!=lpOIO->lpszCaption) ! 893: SetWindowText(hDlg, lpOIO->lpszCaption); ! 894: ! 895: ! 896: //All Done: call the hook with lCustData ! 897: UStandardHook(lpIO, hDlg, WM_INITDIALOG, wParam, lpOIO->lCustData); ! 898: ! 899: /* ! 900: * We either set focus to the listbox or the edit control. In either ! 901: * case we don't want Windows to do any SetFocus, so we return FALSE. ! 902: */ ! 903: return FALSE; ! 904: } ! 905: ! 906: ! 907: ! 908: ! 909: ! 910: ! 911: /* ! 912: * UFillClassList ! 913: * ! 914: * Purpose: ! 915: * Enumerates available OLE object classes from the registration ! 916: * database and fills a listbox with those names. ! 917: * ! 918: * Note that this function removes any prior contents of the listbox. ! 919: * ! 920: * Parameters: ! 921: * hList HWND to the listbox to fill. ! 922: * cIDEx UINT number of CLSIDs to exclude in lpIDEx ! 923: * lpIDEx LPCLSID to CLSIDs to leave out of the listbox. ! 924: * fVerify BOOL indicating if we are to validate existence of ! 925: * servers before putting them in the list. ! 926: * ! 927: * Return Value: ! 928: * UINT Number of strings added to the listbox, -1 on failure. ! 929: */ ! 930: ! 931: UINT UFillClassList(HWND hList, UINT cIDEx, LPCLSID lpIDEx, BOOL fVerify) ! 932: { ! 933: DWORD dw; ! 934: UINT cStrings=0; ! 935: UINT i; ! 936: UINT cch; ! 937: HKEY hKey; ! 938: LONG lRet; ! 939: HFILE hFile; ! 940: OFSTRUCT of; ! 941: BOOL fExclude; ! 942: LPMALLOC pIMalloc; ! 943: LPSTR pszExec; ! 944: LPSTR pszClass; ! 945: LPSTR pszKey; ! 946: LPSTR pszID; ! 947: CLSID clsid; ! 948: ! 949: //Get some work buffers ! 950: if (NOERROR!=CoGetMalloc(MEMCTX_TASK, &pIMalloc)) ! 951: return (UINT)-1; ! 952: ! 953: pszExec=(LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX*4); ! 954: ! 955: if (NULL==pszExec) ! 956: { ! 957: pIMalloc->lpVtbl->Release(pIMalloc); ! 958: return (UINT)-1; ! 959: } ! 960: ! 961: pszClass=pszExec+OLEUI_CCHKEYMAX; ! 962: pszKey=pszClass+OLEUI_CCHKEYMAX; ! 963: pszID=pszKey+OLEUI_CCHKEYMAX; ! 964: ! 965: //Open up the root key. ! 966: lRet=RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey); ! 967: ! 968: if ((LONG)ERROR_SUCCESS!=lRet) ! 969: { ! 970: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszExec); ! 971: pIMalloc->lpVtbl->Release(pIMalloc); ! 972: return (UINT)-1; ! 973: } ! 974: ! 975: //Clean out the existing strings. ! 976: SendMessage(hList, LB_RESETCONTENT, 0, 0L); ! 977: ! 978: cStrings=0; ! 979: ! 980: while (TRUE) ! 981: { ! 982: lRet=RegEnumKey(hKey, cStrings++, pszClass, OLEUI_CCHKEYMAX); ! 983: ! 984: if ((LONG)ERROR_SUCCESS!=lRet) ! 985: break; ! 986: ! 987: //Cheat on lstrcat by using lstrcpy after this string, saving time ! 988: cch=lstrlen(pszClass); ! 989: ! 990: //Check for a \protocol\StdFileEditing\server entry. ! 991: lstrcpy(pszClass+cch, "\\protocol\\StdFileEditing\\server"); ! 992: ! 993: dw=OLEUI_CCHKEYMAX; ! 994: lRet=RegQueryValue(hKey, pszClass, pszKey, &dw); ! 995: ! 996: if ((LONG)ERROR_SUCCESS==lRet) ! 997: { ! 998: /* ! 999: * Check if the EXE actually exists. By default we don't do this ! 1000: * to bring up the dialog faster. If an application wants to be ! 1001: * stringent, they can provide IOF_VERIFYSERVERSEXIST. ! 1002: */ ! 1003: ! 1004: hFile = !HFILE_ERROR; ! 1005: ! 1006: if (fVerify) ! 1007: hFile=OpenFile(pszKey, &of, OF_EXIST); ! 1008: ! 1009: if (HFILE_ERROR!=hFile) ! 1010: { ! 1011: dw=OLEUI_CCHKEYMAX; ! 1012: *(pszClass+cch)=0; // set back to rootkey ! 1013: // Get full user type name ! 1014: lRet=RegQueryValue(hKey, pszClass, pszKey, &dw); ! 1015: ! 1016: if ((LONG)ERROR_SUCCESS!=lRet) ! 1017: continue; // error getting type name--skip this class ! 1018: ! 1019: //Tell the code below to get the string for us. ! 1020: pszID=NULL; ! 1021: } ! 1022: } ! 1023: else ! 1024: { ! 1025: /* ! 1026: * No \protocol\StdFileEditing\server entry. Look to see if ! 1027: * there's an Insertable entry. If there is, then use the ! 1028: * Clsid to look at CLSID\clsid\LocalServer and \InprocServer ! 1029: */ ! 1030: ! 1031: lstrcpy(pszClass+cch, "\\Insertable"); ! 1032: ! 1033: dw=OLEUI_CCHKEYMAX; ! 1034: lRet=RegQueryValue(hKey, pszClass, pszKey, &dw); ! 1035: ! 1036: if ((LONG)ERROR_SUCCESS!=lRet) ! 1037: continue; // Insertable NOT found--skip this class ! 1038: ! 1039: //Get memory for pszID ! 1040: pszID=pIMalloc->lpVtbl->Alloc(pIMalloc, OLEUI_CCHKEYMAX); ! 1041: ! 1042: if (NULL==pszID) ! 1043: continue; ! 1044: ! 1045: *(pszClass+cch)=0; // set back to rootkey ! 1046: lstrcat(pszClass+cch, "\\CLSID"); ! 1047: ! 1048: dw=OLEUI_CCHKEYMAX; ! 1049: lRet=RegQueryValue(hKey, pszClass, pszID, &dw); ! 1050: ! 1051: if ((LONG)ERROR_SUCCESS!=lRet) ! 1052: continue; // CLSID subkey not found ! 1053: ! 1054: lstrcpy(pszExec, "CLSID\\"); ! 1055: lstrcat(pszExec, pszID); ! 1056: ! 1057: //CLSID\ is 6, dw contains pszID length. ! 1058: cch=6+(UINT)dw; ! 1059: ! 1060: lstrcpy(pszExec+cch, "\\LocalServer"); ! 1061: dw=OLEUI_CCHKEYMAX; ! 1062: lRet=RegQueryValue(hKey, pszExec, pszKey, &dw); ! 1063: ! 1064: if ((LONG)ERROR_SUCCESS!=lRet) ! 1065: { ! 1066: //Try InprocServer ! 1067: lstrcpy(pszExec+cch, "\\InProcServer"); ! 1068: dw=OLEUI_CCHKEYMAX; ! 1069: lRet=RegQueryValue(hKey, pszExec, pszKey, &dw); ! 1070: ! 1071: if ((LONG)ERROR_SUCCESS!=lRet) ! 1072: continue; ! 1073: } ! 1074: ! 1075: if (fVerify) ! 1076: { ! 1077: if (HFILE_ERROR==OpenFile(pszKey, &of, OF_EXIST)) ! 1078: continue; ! 1079: } ! 1080: ! 1081: dw=OLEUI_CCHKEYMAX; ! 1082: lRet=RegQueryValue(hKey, pszExec, pszKey, &dw); ! 1083: *(pszExec+cch)=0; //Remove \\*Server ! 1084: ! 1085: if ((LONG)ERROR_SUCCESS!=lRet) ! 1086: continue; ! 1087: } ! 1088: ! 1089: //Get CLSID to add to listbox. ! 1090: if (NULL==pszID) ! 1091: { ! 1092: CLSIDFromProgID(pszClass, &clsid); ! 1093: StringFromCLSID(&clsid, &pszID); ! 1094: } ! 1095: else ! 1096: CLSIDFromString(pszID, &clsid); ! 1097: ! 1098: //Check if this CLSID is in the exclusion list. ! 1099: fExclude=FALSE; ! 1100: ! 1101: for (i=0; i < cIDEx; i++) ! 1102: { ! 1103: if (IsEqualCLSID(&clsid, (LPCLSID)(lpIDEx+i))) ! 1104: { ! 1105: fExclude=TRUE; ! 1106: break; ! 1107: } ! 1108: } ! 1109: ! 1110: if (fExclude) ! 1111: continue; ! 1112: ! 1113: //We go through all the conditions, add the string. ! 1114: lstrcat(pszKey, "\t"); ! 1115: lstrcat(pszKey, pszID); ! 1116: SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)pszKey); ! 1117: ! 1118: //We always allocated this regardless of the path ! 1119: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszID); ! 1120: } ! 1121: ! 1122: ! 1123: //Select the first item by default ! 1124: SendMessage(hList, LB_SETCURSEL, 0, 0L); ! 1125: RegCloseKey(hKey); ! 1126: ! 1127: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszExec); ! 1128: pIMalloc->lpVtbl->Release(pIMalloc); ! 1129: ! 1130: return cStrings; ! 1131: } ! 1132: ! 1133: ! 1134: ! 1135: ! 1136: ! 1137: /* ! 1138: * FToggleObjectSource ! 1139: * ! 1140: * Purpose: ! 1141: * Handles enabling, disabling, showing, and flag manipulation when the ! 1142: * user changes between Create New, Insert File, and Link File in the ! 1143: * Insert Object dialog. ! 1144: * ! 1145: * Parameters: ! 1146: * hDlg HWND of the dialog ! 1147: * lpIO LPINSERTOBJECT pointing to the dialog structure ! 1148: * dwOption DWORD flag indicating the option just selected: ! 1149: * IOF_SELECTCREATENEW or IOF_SELECTCREATEFROMFILE ! 1150: * ! 1151: * Return Value: ! 1152: * BOOL TRUE if the option was already selected, FALSE otherwise. ! 1153: */ ! 1154: ! 1155: BOOL FToggleObjectSource(HWND hDlg, LPINSERTOBJECT lpIO, DWORD dwOption) ! 1156: { ! 1157: BOOL fTemp; ! 1158: UINT uTemp; ! 1159: DWORD dwTemp; ! 1160: int i; ! 1161: ! 1162: //Skip all of this if we're already selected. ! 1163: if (lpIO->dwFlags & dwOption) ! 1164: return TRUE; ! 1165: ! 1166: ! 1167: // if we're switching from "from file" to "create new" and we've got ! 1168: // an icon for "from file", then we need to save it so that we can ! 1169: // show it if the user reselects "from file". ! 1170: ! 1171: if ( (IOF_SELECTCREATENEW == dwOption) && ! 1172: (lpIO->dwFlags & IOF_CHECKDISPLAYASICON) ) ! 1173: lpIO->hMetaPictFile = (HGLOBAL)SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGEGET, 0, 0L); ! 1174: ! 1175: /* ! 1176: * 1. Change the Display As Icon checked state to reflect the ! 1177: * selection for this option, stored in the fAsIcon* flags. ! 1178: */ ! 1179: fTemp=(IOF_SELECTCREATENEW==dwOption) ? lpIO->fAsIconNew : lpIO->fAsIconFile; ! 1180: ! 1181: if (fTemp) ! 1182: lpIO->dwFlags |=IOF_CHECKDISPLAYASICON; ! 1183: else ! 1184: lpIO->dwFlags &=~IOF_CHECKDISPLAYASICON; ! 1185: ! 1186: CheckDlgButton(hDlg, ID_IO_DISPLAYASICON ! 1187: , (BOOL)(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON))); ! 1188: ! 1189: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), fTemp); ! 1190: ! 1191: /* ! 1192: * 2. Display Icon: Enabled on Create New or on Create from File if ! 1193: * there is a selected file. ! 1194: */ ! 1195: fTemp=(IOF_SELECTCREATENEW==dwOption) ? TRUE : lpIO->fFileSelected; ! 1196: EnableWindow(GetDlgItem(hDlg, ID_IO_DISPLAYASICON), fTemp); ! 1197: ! 1198: //OK and Link follow the same enabling as Display As Icon. ! 1199: EnableWindow(GetDlgItem(hDlg, IDOK), fTemp); ! 1200: EnableWindow(GetDlgItem(hDlg, ID_IO_LINKFILE), fTemp); ! 1201: ! 1202: //3. Enable Browse... when Create from File is selected. ! 1203: fTemp=(IOF_SELECTCREATENEW==dwOption); ! 1204: EnableWindow(GetDlgItem(hDlg, ID_IO_FILE), !fTemp); ! 1205: EnableWindow(GetDlgItem(hDlg, ID_IO_FILEDISPLAY), !fTemp); ! 1206: ! 1207: /* ! 1208: * 4. Switch between Object Type listbox on Create New and ! 1209: * file buttons on others. ! 1210: */ ! 1211: uTemp=(fTemp) ? SW_SHOWNORMAL : SW_HIDE; ! 1212: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPELIST, uTemp); ! 1213: StandardShowDlgItem(hDlg, ID_IO_OBJECTTYPETEXT, uTemp); ! 1214: ! 1215: uTemp=(fTemp) ? SW_HIDE : SW_SHOWNORMAL; ! 1216: StandardShowDlgItem(hDlg, ID_IO_FILETEXT, uTemp); ! 1217: StandardShowDlgItem(hDlg, ID_IO_FILETYPE, uTemp); ! 1218: StandardShowDlgItem(hDlg, ID_IO_FILEDISPLAY, uTemp); ! 1219: StandardShowDlgItem(hDlg, ID_IO_FILE, uTemp); ! 1220: ! 1221: //Link is always hidden if IOF_DISABLELINK is set. ! 1222: if (IOF_DISABLELINK & lpIO->dwFlags) ! 1223: uTemp=SW_HIDE; ! 1224: ! 1225: StandardShowDlgItem(hDlg, ID_IO_LINKFILE, uTemp); //last use of uTemp ! 1226: ! 1227: ! 1228: //5. Clear out existing any flags selection and set the new one ! 1229: dwTemp=IOF_SELECTCREATENEW | IOF_SELECTCREATEFROMFILE; ! 1230: lpIO->dwFlags=(lpIO->dwFlags & ~dwTemp) | dwOption; ! 1231: ! 1232: ! 1233: /* ! 1234: * Show or hide controls as appropriate. Do the icon ! 1235: * display last because it will take some time to repaint. ! 1236: * If we do it first then the dialog looks too sluggish. ! 1237: */ ! 1238: ! 1239: i=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON) ? SW_SHOWNORMAL : SW_HIDE; ! 1240: StandardShowDlgItem(hDlg, ID_IO_CHANGEICON, i); ! 1241: StandardShowDlgItem(hDlg, ID_IO_ICONDISPLAY, i); ! 1242: ! 1243: ! 1244: //6.Change result display ! 1245: SetInsertObjectResults(hDlg, lpIO); ! 1246: ! 1247: /* ! 1248: * 7. For Create New, twiddle the listbox to think we selected it ! 1249: * so it updates the icon from the object type. ! 1250: * ! 1251: * For Insert or Link file, set the focus to the filename button ! 1252: * and update the icon if necessary. ! 1253: */ ! 1254: if (fTemp) ! 1255: UpdateClassIcon(hDlg, lpIO, GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST)); ! 1256: ! 1257: else ! 1258: { ! 1259: if (lpIO->fAsIconFile && (NULL != lpIO->hMetaPictFile) ) ! 1260: { ! 1261: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, (WPARAM)lpIO->hMetaPictFile, 0L); ! 1262: lpIO->hMetaPictFile = 0; ! 1263: } ! 1264: else ! 1265: UpdateClassIcon(hDlg, lpIO, NULL); ! 1266: ! 1267: SetFocus(GetDlgItem(hDlg, ID_IO_FILE)); ! 1268: } ! 1269: ! 1270: return FALSE; ! 1271: } ! 1272: ! 1273: ! 1274: /* ! 1275: * UpdateClassType ! 1276: * ! 1277: * Purpose: ! 1278: * Updates static text control to reflect current file type. Assumes ! 1279: * a valid filename. ! 1280: * ! 1281: * Parameters ! 1282: * hDlg HWND of the dialog box. ! 1283: * lpIO LPINSERTOBJECT pointing to the dialog structure ! 1284: * fSet TRUE to set the text, FALSE to explicitly clear it ! 1285: * ! 1286: * Return Value: ! 1287: * None ! 1288: */ ! 1289: ! 1290: void UpdateClassType(HWND hDlg, LPINSERTOBJECT lpIO, BOOL fSet) ! 1291: { ! 1292: ! 1293: CLSID clsid; ! 1294: char szFileName[OLEUI_CCHPATHMAX]; ! 1295: char szFileType[OLEUI_CCHLABELMAX]; ! 1296: ! 1297: *szFileType = '\0'; ! 1298: ! 1299: if (fSet) ! 1300: { ! 1301: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, (LPSTR)szFileName, OLEUI_CCHPATHMAX); ! 1302: ! 1303: if (NOERROR == GetClassFile((LPSTR)szFileName, &clsid) ) ! 1304: OleStdGetUserTypeOfClass(&clsid, szFileType, OLEUI_CCHLABELMAX, NULL); ! 1305: ! 1306: } ! 1307: ! 1308: SetDlgItemText(hDlg, ID_IO_FILETYPE, (LPSTR)szFileType); ! 1309: ! 1310: return; ! 1311: } ! 1312: ! 1313: ! 1314: /* ! 1315: * UpdateClassIcon ! 1316: * ! 1317: * Purpose: ! 1318: * Handles LBN_SELCHANGE for the Object Type listbox. On a selection ! 1319: * change, we extract an icon from the server handling the currently ! 1320: * selected object type using the utility function HIconFromClass. ! 1321: * Note that we depend on the behavior of FillClassList to stuff the ! 1322: * object class after a tab in the listbox string that we hide from ! 1323: * view (see WM_INITDIALOG). ! 1324: * ! 1325: * Parameters ! 1326: * hDlg HWND of the dialog box. ! 1327: * lpIO LPINSERTOBJECT pointing to the dialog structure ! 1328: * hList HWND of the Object Type listbox. ! 1329: * ! 1330: * Return Value: ! 1331: * None ! 1332: */ ! 1333: ! 1334: void UpdateClassIcon(HWND hDlg, LPINSERTOBJECT lpIO, HWND hList) ! 1335: { ! 1336: UINT iSel; ! 1337: DWORD cb; ! 1338: LPMALLOC pIMalloc; ! 1339: LPSTR pszName, pszCLSID, pszTemp; ! 1340: HGLOBAL hMetaPict; ! 1341: ! 1342: LRESULT dwRet; ! 1343: ! 1344: ! 1345: //If Display as Icon is not selected, exit ! 1346: if (!(lpIO->dwFlags & IOF_CHECKDISPLAYASICON)) ! 1347: return; ! 1348: ! 1349: /* ! 1350: * When we change object type selection, get the new icon for that ! 1351: * type into our structure and update it in the display. We use the ! 1352: * class in the listbox when Create New is selected or the association ! 1353: * with the extension in Create From File. ! 1354: */ ! 1355: ! 1356: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 1357: { ! 1358: iSel=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L); ! 1359: ! 1360: if (LB_ERR==(int)iSel) ! 1361: return; ! 1362: ! 1363: //Check to see if we've already got the hMetaPict for this item ! 1364: dwRet=SendMessage(hList, LB_GETITEMDATA, (WPARAM)iSel, 0L); ! 1365: ! 1366: hMetaPict=(HGLOBAL)(UINT)dwRet; ! 1367: ! 1368: if (hMetaPict) ! 1369: { ! 1370: //Yep, we've already got it, so just display it and return. ! 1371: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, (WPARAM)hMetaPict, 0L); ! 1372: return; ! 1373: } ! 1374: ! 1375: iSel=(UINT)SendMessage(hList, LB_GETCURSEL, 0, 0L); ! 1376: ! 1377: if (LB_ERR==(int)iSel) ! 1378: return; ! 1379: ! 1380: //Allocate a string to hold the entire listbox string ! 1381: cb=SendMessage(hList, LB_GETTEXTLEN, iSel, 0L); ! 1382: } ! 1383: else ! 1384: cb=OLEUI_CCHPATHMAX; ! 1385: ! 1386: if (NOERROR!=CoGetMalloc(MEMCTX_TASK, &pIMalloc)) ! 1387: return; ! 1388: ! 1389: pszName=(LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, cb+1); ! 1390: ! 1391: if (NULL==pszName) ! 1392: { ! 1393: pIMalloc->lpVtbl->Release(pIMalloc); ! 1394: return; ! 1395: } ! 1396: ! 1397: *pszName=0; ! 1398: ! 1399: //Get the clsid we want. ! 1400: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 1401: { ! 1402: //Grab the classname string from the list ! 1403: SendMessage(hList, LB_GETTEXT, iSel, (LONG)pszName); ! 1404: ! 1405: //Set pointer to CLSID (string) ! 1406: pszCLSID=PointerToNthField(pszName, 2, '\t'); ! 1407: ! 1408: //Null terminate pszName string ! 1409: pszTemp=AnsiPrev(pszName, pszCLSID); ! 1410: ! 1411: *pszTemp='\0'; ! 1412: CLSIDFromString(pszCLSID, &lpIO->clsid); ! 1413: ! 1414: hMetaPict = GetIconOfClass(ghInst, &lpIO->clsid, NULL, TRUE); ! 1415: } ! 1416: ! 1417: else ! 1418: { ! 1419: //Get the class from the filename ! 1420: GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, pszName, OLEUI_CCHPATHMAX); ! 1421: ! 1422: hMetaPict = GetIconOfFile(ghInst, ! 1423: pszName, ! 1424: lpIO->dwFlags & IOF_CHECKLINK ? TRUE : FALSE); ! 1425: } ! 1426: ! 1427: ! 1428: //Replace the current display with this new one. ! 1429: SendDlgItemMessage(hDlg, ID_IO_ICONDISPLAY, IBXM_IMAGESET, (WPARAM)hMetaPict, 0L); ! 1430: ! 1431: //Enable or disable "Change Icon" button depending on whether ! 1432: //we've got a valid filename or not. ! 1433: EnableWindow(GetDlgItem(hDlg, ID_IO_CHANGEICON), hMetaPict ? TRUE : FALSE); ! 1434: ! 1435: //Save the hMetaPict so that we won't have to re-create ! 1436: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 1437: SendMessage(hList, LB_SETITEMDATA, (WPARAM)iSel, MAKELPARAM(hMetaPict,0)); ! 1438: ! 1439: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszName); ! 1440: pIMalloc->lpVtbl->Release(pIMalloc); ! 1441: return; ! 1442: } ! 1443: ! 1444: ! 1445: ! 1446: ! 1447: /* ! 1448: * SetInsertObjectResults ! 1449: * ! 1450: * Purpose: ! 1451: * Centralizes setting of the Result and icon displays in the Insert Object ! 1452: * dialog. Handles loading the appropriate string from the module's ! 1453: * resources and setting the text, displaying the proper result picture, ! 1454: * and showing the proper icon. ! 1455: * ! 1456: * Parameters: ! 1457: * hDlg HWND of the dialog box so we can access controls. ! 1458: * lpIO LPINSERTOBJECT in which we assume that the ! 1459: * current radiobutton and Display as Icon selections ! 1460: * are set. We use the state of those variables to ! 1461: * determine which string we use. ! 1462: * ! 1463: * Return Value: ! 1464: * None ! 1465: */ ! 1466: ! 1467: void SetInsertObjectResults(HWND hDlg, LPINSERTOBJECT lpIO) ! 1468: { ! 1469: LPSTR pszT, psz1, psz2, psz3, psz4, pszTemp; ! 1470: UINT i, iString1, iString2, iImage, cch; ! 1471: LPMALLOC pIMalloc; ! 1472: BOOL fAsIcon; ! 1473: ! 1474: /* ! 1475: * We need scratch memory for loading the stringtable string, loading ! 1476: * the object type from the listbox, and constructing the final string. ! 1477: * We therefore allocate three buffers as large as the maximum message ! 1478: * length (512) plus the object type, guaranteeing that we have enough ! 1479: * in all cases. ! 1480: */ ! 1481: i=(UINT)SendDlgItemMessage(hDlg, ID_IO_OBJECTTYPELIST, LB_GETCURSEL, 0, 0L); ! 1482: cch=512+(UINT)SendDlgItemMessage(hDlg, ID_IO_OBJECTTYPELIST, LB_GETTEXTLEN, i, 0L); ! 1483: ! 1484: if (NOERROR!=CoGetMalloc(MEMCTX_TASK, &pIMalloc)) ! 1485: return; ! 1486: ! 1487: pszTemp=(LPSTR)pIMalloc->lpVtbl->Alloc(pIMalloc, (DWORD)(4*cch)); ! 1488: ! 1489: if (NULL==pszTemp) ! 1490: { ! 1491: pIMalloc->lpVtbl->Release(pIMalloc); ! 1492: return; ! 1493: } ! 1494: ! 1495: psz1=pszTemp; ! 1496: psz2=psz1+cch; ! 1497: psz3=psz2+cch; ! 1498: psz4=psz3+cch; ! 1499: ! 1500: fAsIcon=(0L!=(lpIO->dwFlags & IOF_CHECKDISPLAYASICON)); ! 1501: ! 1502: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 1503: { ! 1504: iString1 = fAsIcon ? IDS_IORESULTNEWICON : IDS_IORESULTNEW; ! 1505: iString2 = 0; ! 1506: iImage = fAsIcon ? RESULTIMAGE_EMBEDICON : RESULTIMAGE_EMBED; ! 1507: } ! 1508: ! 1509: if (lpIO->dwFlags & IOF_SELECTCREATEFROMFILE) ! 1510: { ! 1511: //Pay attention to Link checkbox ! 1512: if (lpIO->dwFlags & IOF_CHECKLINK) ! 1513: { ! 1514: iString1 = fAsIcon ? IDS_IORESULTLINKFILEICON1 : IDS_IORESULTLINKFILE1; ! 1515: iString2 = fAsIcon ? IDS_IORESULTLINKFILEICON2 : IDS_IORESULTLINKFILE2; ! 1516: iImage =fAsIcon ? RESULTIMAGE_LINKICON : RESULTIMAGE_LINK; ! 1517: } ! 1518: else ! 1519: { ! 1520: iString1 = IDS_IORESULTFROMFILE1; ! 1521: iString2 = fAsIcon ? IDS_IORESULTFROMFILEICON2 : IDS_IORESULTFROMFILE2; ! 1522: iImage =fAsIcon ? RESULTIMAGE_EMBEDICON : RESULTIMAGE_EMBED; ! 1523: } ! 1524: } ! 1525: ! 1526: //Default is an empty string. ! 1527: *psz1=0; ! 1528: ! 1529: if (0!=LoadString(ghInst, iString1, psz1, cch)) ! 1530: { ! 1531: ! 1532: // Load second string, if necessary ! 1533: if ( (0 != iString2) ! 1534: && (0 != LoadString(ghInst, iString2, psz4, cch)) ) ! 1535: { ! 1536: lstrcat(psz1, psz4); // concatenate strings together. ! 1537: } ! 1538: ! 1539: ! 1540: ! 1541: //In Create New, do the extra step of inserting the object type string ! 1542: if (lpIO->dwFlags & IOF_SELECTCREATENEW) ! 1543: { ! 1544: SendDlgItemMessage(hDlg, ID_IO_OBJECTTYPELIST, LB_GETTEXT ! 1545: , i, (LONG)psz2); ! 1546: ! 1547: //Null terminate at any tab (before the classname) ! 1548: pszT=psz2; ! 1549: while ('\t'!=*pszT && 0!=*pszT) ! 1550: pszT++; ! 1551: *pszT=0; ! 1552: ! 1553: //Build the string and point psz1 to it. ! 1554: wsprintf(psz3, psz1, psz2); ! 1555: psz1=psz3; ! 1556: } ! 1557: } ! 1558: ! 1559: //If LoadString failed, we simply clear out the results (*psz1=0 above) ! 1560: SetDlgItemText(hDlg, ID_IO_RESULTTEXT, psz1); ! 1561: ! 1562: //Go change the image and Presto! There you have it. ! 1563: SendDlgItemMessage(hDlg, ID_IO_RESULTIMAGE, RIM_IMAGESET, iImage, 0L); ! 1564: ! 1565: pIMalloc->lpVtbl->Free(pIMalloc, (LPVOID)pszTemp); ! 1566: pIMalloc->lpVtbl->Release(pIMalloc); ! 1567: return; ! 1568: } ! 1569: ! 1570: ! 1571: ! 1572: /* ! 1573: * FValidateInsertFile ! 1574: * ! 1575: * Purpose: ! 1576: * Given a possibly partial pathname from the file edit control, ! 1577: * attempt to locate the file and if found, store the full path ! 1578: * in the edit control ID_IO_FILEDISPLAY. ! 1579: * ! 1580: * Parameters: ! 1581: * hDlg HWND of the dialog box. ! 1582: * fTellUser BOOL TRUE if function should tell user, FALSE if ! 1583: * function should validate silently. ! 1584: * ! 1585: * Return Value: ! 1586: * BOOL TRUE if the file is acceptable, FALSE otherwise. ! 1587: */ ! 1588: ! 1589: BOOL FValidateInsertFile(HWND hDlg, BOOL fTellUser, UINT FAR* lpnErrCode) ! 1590: { ! 1591: OFSTRUCT of; ! 1592: HFILE hFile; ! 1593: char szFile[OLEUI_CCHPATHMAX]; ! 1594: ! 1595: *lpnErrCode = 0; ! 1596: /* ! 1597: * To validate we attempt OpenFile on the string. If OpenFile ! 1598: * fails then we display an error. If not, OpenFile will store ! 1599: * the complete path to that file in the OFSTRUCT which we can ! 1600: * then stuff in the edit control. ! 1601: */ ! 1602: ! 1603: if (0==GetDlgItemText(hDlg, ID_IO_FILEDISPLAY, szFile, sizeof(szFile))) ! 1604: return FALSE; // #4569 : return FALSE when there is no text in ctl ! 1605: ! 1606: hFile=OpenFile(szFile, &of, OF_EXIST); ! 1607: ! 1608: // if file is currently open (ie. sharing violation) OleCreateFromFile ! 1609: // and OleCreateLinkToFile can still succeed; do not consider it an ! 1610: // error. ! 1611: if (HFILE_ERROR==hFile && 0x0020/*sharing violation*/!=of.nErrCode) ! 1612: { ! 1613: *lpnErrCode = of.nErrCode; ! 1614: if (fTellUser) ! 1615: OpenFileError(hDlg, of.nErrCode, szFile); ! 1616: return FALSE; ! 1617: } ! 1618: ! 1619: //OFSTRUCT contains an OEM name, not ANSI as we need for the edit box. ! 1620: OemToAnsi(of.szPathName, of.szPathName); ! 1621: SetDlgItemText(hDlg, ID_IO_FILEDISPLAY, of.szPathName); ! 1622: return TRUE; ! 1623: } ! 1624: ! 1625: ! 1626: /* ! 1627: * InsertObjectCleanup ! 1628: * ! 1629: * Purpose: ! 1630: * Clears cached icon metafiles from those stored in the listbox. ! 1631: * ! 1632: * Parameters: ! 1633: * hDlg HWND of the dialog. ! 1634: * ! 1635: * Return Value: ! 1636: * None ! 1637: */ ! 1638: ! 1639: void InsertObjectCleanup(HWND hDlg) ! 1640: { ! 1641: HWND hList; ! 1642: UINT iItems; ! 1643: HGLOBAL hMetaPict; ! 1644: LRESULT dwRet; ! 1645: UINT i; ! 1646: ! 1647: hList=GetDlgItem(hDlg, ID_IO_OBJECTTYPELIST); ! 1648: iItems=(UINT)SendMessage(hList, LB_GETCOUNT, 0, 0L); ! 1649: ! 1650: for (i=0; i < iItems; i++) ! 1651: { ! 1652: dwRet=SendMessage(hList, LB_GETITEMDATA, (WPARAM)i, 0L); ! 1653: ! 1654: //Cast of LRESULT to UINT to HGLOBAL portable to Win32. ! 1655: hMetaPict=(HGLOBAL)(UINT)dwRet; ! 1656: ! 1657: if (hMetaPict) ! 1658: OleUIMetafilePictIconFree(hMetaPict); ! 1659: } ! 1660: ! 1661: return; ! 1662: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.