|
|
1.1 ! root 1: /* ! 2: * COMMON.C ! 3: * ! 4: * Standardized (and centralized) pieces of each OLE2UI dialog function: ! 5: * UStandardValidation Validates standard fields in each dialog structure ! 6: * UStandardInvocation Invokes a dialog through DialogBoxIndirectParam ! 7: * LpvStandardInit Common WM_INITDIALOG processing ! 8: * LpvStandardEntry Common code to execute on dialog proc entry. ! 9: * FStandardHook Centralized hook calling function. ! 10: * StandardCleanup Common exit/cleanup code. ! 11: * OleUIShowDlgItem Show-Enable/Hide-Disable dialog item ! 12: * ! 13: * Copyright (c)1992 Microsoft Corporation, All Right Reserved ! 14: */ ! 15: ! 16: #define STRICT 1 ! 17: #include "ole2ui.h" ! 18: #include "common.h" ! 19: #include "utility.h" ! 20: #include <malloc.h> ! 21: ! 22: ! 23: /* ! 24: * UStandardValidation ! 25: * ! 26: * Purpose: ! 27: * Performs validation on the standard pieces of any dialog structure, ! 28: * that is, the fields defined in the OLEUISTANDARD structure. ! 29: * ! 30: * Parameters: ! 31: * lpUI const LPOLEUISTANDARD pointing to the shared data of ! 32: * all structs. ! 33: * cbExpect const UINT structure size desired by the caller. ! 34: * phDlgMem const HGLOBAL FAR * in which to store a loaded customized ! 35: * template, if one exists. ! 36: * ! 37: * Return Value: ! 38: * UINT OLEUI_SUCCESS if all validation succeeded. Otherwise ! 39: * it will be one of the standard error codes. ! 40: */ ! 41: ! 42: UINT WINAPI UStandardValidation(const LPOLEUISTANDARD lpUI, const UINT cbExpect ! 43: , const HGLOBAL FAR *phMemDlg) ! 44: { ! 45: HRSRC hRes=NULL; ! 46: HGLOBAL hMem=NULL; ! 47: ! 48: ! 49: /* ! 50: * 1. Validate non-NULL pointer parameter. Note: We don't validate ! 51: * phDlg since it's not passed from an external source. ! 52: */ ! 53: if (NULL==lpUI) ! 54: return OLEUI_ERR_STRUCTURENULL; ! 55: ! 56: //2. Validate that the structure is readable and writable. ! 57: if (IsBadReadPtr(lpUI, cbExpect) || IsBadWritePtr(lpUI, cbExpect)) ! 58: return OLEUI_ERR_STRUCTUREINVALID; ! 59: ! 60: //3. Validate the structure size ! 61: if (cbExpect!=lpUI->cbStruct) ! 62: return OLEUI_ERR_CBSTRUCTINCORRECT; ! 63: ! 64: //4. Validate owner-window handle. NULL is considered valid. ! 65: if (NULL!=lpUI->hWndOwner && !IsWindow(lpUI->hWndOwner)) ! 66: return OLEUI_ERR_HWNDOWNERINVALID; ! 67: ! 68: //5. Validate the dialog caption. NULL is considered valid. ! 69: if (NULL!=lpUI->lpszCaption && IsBadReadPtr(lpUI->lpszCaption, 1)) ! 70: return OLEUI_ERR_LPSZCAPTIONINVALID; ! 71: ! 72: //6. Validate the hook pointer. NULL is considered valid. ! 73: if ((LPFNOLEUIHOOK)NULL!=lpUI->lpfnHook ! 74: && IsBadCodePtr((FARPROC)lpUI->lpfnHook)) ! 75: return OLEUI_ERR_LPFNHOOKINVALID; ! 76: ! 77: /* ! 78: * 7. If hInstance is non-NULL, we have to also check lpszTemplate. ! 79: * Otherwise, lpszTemplate is not used and requires no validation. ! 80: * lpszTemplate cannot be NULL if used. ! 81: */ ! 82: if (NULL!=lpUI->hInstance) ! 83: { ! 84: //Best we can try is one character ! 85: if (NULL==lpUI->lpszTemplate || IsBadReadPtr(lpUI->lpszTemplate, 1)) ! 86: return OLEUI_ERR_LPSZTEMPLATEINVALID; ! 87: ! 88: hRes=FindResource(lpUI->hInstance, lpUI->lpszTemplate, RT_DIALOG); ! 89: ! 90: //This is the only thing that catches invalid non-NULL hInstance ! 91: if (NULL==hRes) ! 92: return OLEUI_ERR_FINDTEMPLATEFAILURE; ! 93: ! 94: hMem=LoadResource(lpUI->hInstance, hRes); ! 95: ! 96: if (NULL==hMem) ! 97: return OLEUI_ERR_LOADTEMPLATEFAILURE; ! 98: } ! 99: ! 100: ! 101: //8. If hResource is non-NULL, be sure we can lock it. ! 102: if (NULL!=lpUI->hResource) ! 103: { ! 104: if ((LPSTR)NULL==GlobalLock(lpUI->hResource)) ! 105: return OLEUI_ERR_HRESOURCEINVALID; ! 106: ! 107: GlobalUnlock(lpUI->hResource); ! 108: } ! 109: ! 110: /* ! 111: * Here we have hMem==NULL if we should use the standard template ! 112: * or the one in lpUI->hResource. If hMem is non-NULL, then we ! 113: * loaded one from the calling application's resources which the ! 114: * caller of this function has to free if it sees any other error. ! 115: */ ! 116: *(HGLOBAL FAR *)phMemDlg=hMem; ! 117: return OLEUI_SUCCESS; ! 118: } ! 119: ! 120: ! 121: ! 122: ! 123: ! 124: /* ! 125: * UStandardInvocation ! 126: * ! 127: * Purpose: ! 128: * Provides standard template loading and calling on DialogBoxIndirectParam ! 129: * for all the OLE UI dialogs. ! 130: * ! 131: * Parameters: ! 132: * lpDlgProc DLGPROC of the dialog function. ! 133: * lpUI LPOLEUISTANDARD containing the dialog structure. ! 134: * hMemDlg HGLOBAL containing the dialog template. If this ! 135: * is NULL and lpUI->hResource is NULL, then we load ! 136: * the standard template given the name in lpszStdTemplate ! 137: * lpszStdTemplate LPCSTR standard template to load if hMemDlg is NULL ! 138: * and lpUI->hResource is NULL. ! 139: * ! 140: * Return Value: ! 141: * UINT OLEUI_SUCCESS if all is well, otherwise and error ! 142: * code. ! 143: */ ! 144: ! 145: UINT WINAPI UStandardInvocation(DLGPROC lpDlgProc, LPOLEUISTANDARD lpUI ! 146: , HGLOBAL hMemDlg, LPCSTR lpszStdTemplate) ! 147: { ! 148: HGLOBAL hTemplate=hMemDlg; ! 149: HRSRC hRes; ! 150: int iRet; ! 151: ! 152: //Make sure we have a template, then lock it down ! 153: if (NULL==hTemplate) ! 154: hTemplate=lpUI->hResource; ! 155: ! 156: if (NULL==hTemplate) ! 157: { ! 158: hRes=FindResource(ghInst, lpszStdTemplate, RT_DIALOG); ! 159: ! 160: if (NULL==hRes) ! 161: { ! 162: return OLEUI_ERR_FINDTEMPLATEFAILURE; ! 163: } ! 164: ! 165: hTemplate=LoadResource(ghInst, hRes); ! 166: ! 167: if (NULL==hTemplate) ! 168: { ! 169: return OLEUI_ERR_LOADTEMPLATEFAILURE; ! 170: } ! 171: } ! 172: ! 173: /* ! 174: * hTemplate has the template to use, so now we can invoke the dialog. ! 175: * Since we have exported all of our dialog procedures using the ! 176: * _export keyword, we do not need to call MakeProcInstance, ! 177: * we can ue the dialog procedure address directly. ! 178: */ ! 179: ! 180: iRet=DialogBoxIndirectParam(ghInst, hTemplate, lpUI->hWndOwner ! 181: , lpDlgProc, (LPARAM)lpUI); ! 182: ! 183: /* ! 184: * Cleanup the template if we explicitly loaded it. Caller is ! 185: * responsible for already loaded template resources. ! 186: */ ! 187: if (hTemplate!=lpUI->hResource) ! 188: FreeResource(hTemplate); ! 189: ! 190: if (-1==iRet) ! 191: return OLEUI_ERR_DIALOGFAILURE; ! 192: ! 193: //Return the code from EndDialog, generally OLEUI_OK or OLEUI_CANCEL ! 194: return (UINT)iRet; ! 195: } ! 196: ! 197: ! 198: ! 199: ! 200: ! 201: ! 202: /* ! 203: * LpvStandardInit ! 204: * ! 205: * Purpose: ! 206: * Default actions for WM_INITDIALOG handling in the dialog, allocating ! 207: * a dialog-specific structure, setting that memory as a dialog property, ! 208: * and creating a small font if necessary setting that font as a property. ! 209: * ! 210: * Parameters: ! 211: * hDlg HWND of the dialog ! 212: * cbStruct UINT size of dialog-specific structure to allocate. ! 213: * fCreateFont BOOL indicating if we need to create a small Helv ! 214: * font for this dialog. ! 215: * phFont HFONT FAR * in which to place a created font. Can be ! 216: * NULL if fCreateFont is FALSE. ! 217: * ! 218: * Return Value: ! 219: * LPVOID Pointer to global memory allocated for the dialog. ! 220: * The memory will have been set as a dialog property ! 221: * using the STRUCTUREPROP label. ! 222: */ ! 223: ! 224: LPVOID WINAPI LpvStandardInit(HWND hDlg, UINT cbStruct, BOOL fCreateFont, HFONT FAR * phFont) ! 225: { ! 226: LPVOID lpv; ! 227: HFONT hFont; ! 228: LOGFONT lf; ! 229: HGLOBAL gh; ! 230: ! 231: //Must have at least sizeof(OLEUISTANDARD) bytes in cbStruct ! 232: if (sizeof(OLEUISTANDARD) > cbStruct || (fCreateFont && NULL==phFont)) ! 233: return NULL; ! 234: ! 235: gh=GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, cbStruct); ! 236: ! 237: if (NULL==gh) ! 238: { ! 239: PostMessage(hDlg, uMsgEndDialog, OLEUI_ERR_GLOBALMEMALLOC, 0L); ! 240: return NULL; ! 241: } ! 242: lpv = GlobalLock(gh); ! 243: SetProp(hDlg, STRUCTUREPROP, gh); ! 244: ! 245: //Create the non-bold font for result and file texts. We call ! 246: hFont=(HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0L); ! 247: GetObject(hFont, sizeof(LOGFONT), &lf); ! 248: lf.lfWeight=FW_NORMAL; ! 249: ! 250: //Attempt to create the font. If this fails, then we return no font. ! 251: *phFont=CreateFontIndirect(&lf); ! 252: ! 253: //If we couldn't create the font, we'll do with the default. ! 254: if (NULL!=*phFont) ! 255: SetProp(hDlg, FONTPROP, (HANDLE)*phFont); ! 256: ! 257: return lpv; ! 258: } ! 259: ! 260: ! 261: ! 262: ! 263: ! 264: /* ! 265: * LpvStandardEntry ! 266: * ! 267: * Purpose: ! 268: * Retrieves the dialog's structure property and calls the hook ! 269: * as necessary. This should be called on entry into all dialog ! 270: * procedures. ! 271: * ! 272: * Parameters: ! 273: * hDlg HWND of the dialog ! 274: * iMsg UINT message to the dialog ! 275: * wParam, lParam WPARAM, LPARAM message parameters ! 276: * puHookResult UINT FAR * in which this function stores the return value ! 277: * from the hook if it is called. If no hook is available, ! 278: * this will be FALSE. ! 279: * ! 280: * Return Value: ! 281: * LPVOID Pointer to the dialog's extra structure held in the ! 282: * STRUCTUREPROP property. ! 283: */ ! 284: ! 285: LPVOID WINAPI LpvStandardEntry(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam ! 286: , UINT FAR * puHookResult) ! 287: { ! 288: LPVOID lpv = NULL; ! 289: HGLOBAL gh; ! 290: ! 291: // This will fail under WM_INITDIALOG, where we allocate using StandardInit ! 292: gh = GetProp(hDlg, STRUCTUREPROP); ! 293: ! 294: if (NULL!=puHookResult && NULL!=gh) ! 295: { ! 296: *puHookResult=0; ! 297: ! 298: // gh was locked previously, lock and unlock to get lpv ! 299: lpv = GlobalLock(gh); ! 300: GlobalUnlock(gh); ! 301: ! 302: //Call the hook for all messages except WM_INITDIALOG ! 303: if (NULL!=lpv && WM_INITDIALOG!=iMsg) ! 304: *puHookResult=UStandardHook(lpv, hDlg, iMsg, wParam, lParam); ! 305: } ! 306: ! 307: return lpv; ! 308: } ! 309: ! 310: ! 311: ! 312: ! 313: /* ! 314: * UStandardHook ! 315: * ! 316: * Purpose: ! 317: * Provides a generic hook calling function assuming that all private ! 318: * dialog structures have a far pointer to their assocated public ! 319: * structure as the first field, and that the first part of the public ! 320: * structure matches an OLEUISTANDARD. ! 321: * ! 322: * Parameters: ! 323: * pv PVOID to the dialog structure. ! 324: * hDlg HWND to send with the call to the hook. ! 325: * iMsg UINT message to send to the hook. ! 326: * wParam, lParam WPARAM, LPARAM message parameters ! 327: * ! 328: * Return Value: ! 329: * UINT Return value from the hook, zero to indicate that ! 330: * default action should occur, nonzero to specify ! 331: * that the hook did process the message. In some ! 332: * circumstances it will be important for the hook to ! 333: * return a non-trivial non-zero value here, such as ! 334: * a brush from WM_CTLCOLOR, in which case the caller ! 335: * should return that value from the dialog procedure. ! 336: */ ! 337: ! 338: UINT WINAPI UStandardHook(LPVOID lpv, HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) ! 339: { ! 340: LPOLEUISTANDARD lpUI; ! 341: UINT uRet=0; ! 342: ! 343: lpUI=*((LPOLEUISTANDARD FAR *)lpv); ! 344: ! 345: if (NULL!=lpUI && NULL!=lpUI->lpfnHook) ! 346: { ! 347: /* ! 348: * In order for the hook to have the proper DS, they should be ! 349: * compiling with -GA -GEs so and usin __export to get everything ! 350: * set up properly. ! 351: */ ! 352: uRet=(*lpUI->lpfnHook)(hDlg, iMsg, wParam, lParam); ! 353: } ! 354: ! 355: return uRet; ! 356: } ! 357: ! 358: ! 359: ! 360: ! 361: ! 362: /* ! 363: * StandardCleanup ! 364: * ! 365: * Purpose: ! 366: * Removes properties and reverses any other standard initiazation ! 367: * done through StandardSetup. ! 368: * ! 369: * Parameters: ! 370: * lpv LPVOID containing the private dialog structure. ! 371: * hDlg HWND of the dialog closing. ! 372: * ! 373: * Return Value: ! 374: * None ! 375: */ ! 376: ! 377: void WINAPI StandardCleanup(LPVOID lpv, HWND hDlg) ! 378: { ! 379: HFONT hFont; ! 380: HGLOBAL gh; ! 381: ! 382: hFont=(HFONT)GetProp(hDlg, FONTPROP); ! 383: ! 384: if (NULL!=hFont) ! 385: DeleteObject(hFont); ! 386: ! 387: RemoveProp(hDlg, FONTPROP); ! 388: ! 389: gh = RemoveProp(hDlg, STRUCTUREPROP); ! 390: if (gh) ! 391: { ! 392: GlobalUnlock(gh); ! 393: GlobalFree(gh); ! 394: } ! 395: return; ! 396: } ! 397: ! 398: ! 399: /* StandardShowDlgItem ! 400: ** ------------------- ! 401: ** Show & Enable or Hide & Disable a dialog item as appropriate. ! 402: ** it is NOT sufficient to simply hide the item; it must be disabled ! 403: ** too or the keyboard accelerator still functions. ! 404: */ ! 405: void WINAPI StandardShowDlgItem(HWND hDlg, int idControl, int nCmdShow) ! 406: { ! 407: if (SW_HIDE == nCmdShow) { ! 408: ShowWindow(GetDlgItem(hDlg, idControl), SW_HIDE); ! 409: EnableWindow(GetDlgItem(hDlg, idControl), FALSE); ! 410: } else { ! 411: ShowWindow(GetDlgItem(hDlg, idControl), SW_SHOWNORMAL); ! 412: EnableWindow(GetDlgItem(hDlg, idControl), TRUE); ! 413: } ! 414: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.