Annotation of mstools/ole20/samples/ole2ui/utility.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * UTILITY.C
                      3:  *
                      4:  * Utility routines for functions inside OLE2UI.DLL
                      5:  *
                      6:  *  General:
                      7:  *  ----------------------
                      8:  *  HourGlassOn             Displays the hourglass
                      9:  *  HourGlassOff            Hides the hourglass
                     10:  *
                     11:  *  Misc Tools:
                     12:  *  ----------------------
                     13:  *  Browse                  Displays the "File..." or "Browse..." dialog.
                     14:  *  ReplaceCharWithNull     Used to form filter strings for Browse.
                     15:  *  ErrorWithFile           Creates an error message with embedded filename
                     16:  *  OpenFileError           Give error message for OpenFile error return
                     17:  *  ChopText                Chop a file path to fit within a specified width
                     18:  *
                     19:  *  Registration Database:
                     20:  *  ----------------------
                     21:  *  HIconFromClass          Extracts the first icon in a class's server path
                     22:  *  FServerFromClass        Retrieves the server path for a class name (fast)
                     23:  *  UClassFromDescription   Finds the classname given a description (slow)
                     24:  *  UDescriptionFromClass   Retrieves the description for a class name (fast)
                     25:  *  FGetVerb                Retrieves a specific verb for a class (fast)
                     26:  *
                     27:  *
                     28:  * Copyright (c)1992 Microsoft Corporation, All Right Reserved
                     29:  */
                     30: 
                     31: #define STRICT  1
                     32: #include "ole2ui.h"
                     33: #include <stdlib.h>
                     34: #include <commdlg.h>
                     35: #include <memory.h>
                     36: #include <cderr.h>
                     37: #include "common.h"
                     38: #include "utility.h"
                     39: #include "geticon.h"
                     40: 
                     41: OLEDBGDATA
                     42: 
                     43: /*
                     44:  * HourGlassOn
                     45:  *
                     46:  * Purpose:
                     47:  *  Shows the hourglass cursor returning the last cursor in use.
                     48:  *
                     49:  * Parameters:
                     50:  *  None
                     51:  *
                     52:  * Return Value:
                     53:  *  HCURSOR         Cursor in use prior to showing the hourglass.
                     54:  */
                     55: 
                     56: HCURSOR WINAPI HourGlassOn(void)
                     57:     {
                     58:     HCURSOR     hCur;
                     59: 
                     60:     hCur=SetCursor(LoadCursor(NULL, IDC_WAIT));
                     61:     ShowCursor(TRUE);
                     62: 
                     63:     return hCur;
                     64:     }
                     65: 
                     66: 
                     67: 
                     68: /*
                     69:  * HourGlassOff
                     70:  *
                     71:  * Purpose:
                     72:  *  Turns off the hourglass restoring it to a previous cursor.
                     73:  *
                     74:  * Parameters:
                     75:  *  hCur            HCURSOR as returned from HourGlassOn
                     76:  *
                     77:  * Return Value:
                     78:  *  None
                     79:  */
                     80: 
                     81: void WINAPI HourGlassOff(HCURSOR hCur)
                     82:     {
                     83:     ShowCursor(FALSE);
                     84:     SetCursor(hCur);
                     85:     return;
                     86:     }
                     87: 
                     88: 
                     89: 
                     90: 
                     91: /*
                     92:  * Browse
                     93:  *
                     94:  * Purpose:
                     95:  *  Displays the standard GetOpenFileName dialog with the title of
                     96:  *  "Browse."  The types listed in this dialog are controlled through
                     97:  *  iFilterString.  If it's zero, then the types are filled with "*.*"
                     98:  *  Otherwise that string is loaded from resources and used.
                     99:  *
                    100:  * Parameters:
                    101:  *  hWndOwner       HWND owning the dialog
                    102:  *  lpszFile        LPSTR specifying the initial file and the buffer in
                    103:  *                  which to return the selected file.  If there is no
                    104:  *                  initial file the first character of this string should
                    105:  *                  be NULL.
                    106:  *  lpszInitialDir  LPSTR specifying the initial directory.  If none is to
                    107:  *                  set (ie, the cwd should be used), then this parameter 
                    108:  *                  should be NULL.
                    109:  *  cchFile         UINT length of pszFile
                    110:  *  iFilterString   UINT index into the stringtable for the filter string.
                    111:  *  dwOfnFlags      DWORD flags to OR with OFN_HIDEREADONLY
                    112:  *
                    113:  * Return Value:
                    114:  *  BOOL            TRUE if the user selected a file and pressed OK.
                    115:  *                  FALSE otherwise, such as on pressing Cancel.
                    116:  */
                    117: 
                    118: BOOL WINAPI Browse(HWND hWndOwner, LPSTR lpszFile, LPSTR lpszInitialDir, UINT cchFile, UINT iFilterString, DWORD dwOfnFlags)
                    119:     {
                    120:        UINT           cch;
                    121:        char           szFilters[256];
                    122:        OPENFILENAME   ofn;
                    123:        BOOL           fStatus;
                    124:        DWORD          dwError;
                    125:        char            szDlgTitle[128];  // that should be big enough
                    126: 
                    127:     if (NULL==lpszFile || 0==cchFile)
                    128:         return FALSE;
                    129: 
                    130:     /*
                    131:      * REVIEW:  Exact contents of the filter combobox is TBD.  One idea
                    132:      * is to take all the extensions in the RegDB and place them in here
                    133:      * with the descriptive class name associate with them.  This has the
                    134:      * extra step of finding all extensions of the same class handler and
                    135:      * building one extension string for all of them.  Can get messy quick.
                    136:      * UI demo has only *.* which we do for now.
                    137:      */
                    138: 
                    139:     if (0!=iFilterString)
                    140:         cch=LoadString(ghInst, iFilterString, (LPSTR)szFilters, sizeof(szFilters));
                    141:     else
                    142:         {
                    143:         szFilters[0]=0;
                    144:         cch=1;
                    145:         }
                    146: 
                    147:     if (0==cch)
                    148:         return FALSE;
                    149: 
                    150:     ReplaceCharWithNull(szFilters, szFilters[cch-1]);
                    151: 
                    152:     //Prior string must also be initialized, if there is one.
                    153:     _fmemset((LPOPENFILENAME)&ofn, 0, sizeof(ofn));
                    154:     ofn.lStructSize =sizeof(ofn);
                    155:     ofn.hwndOwner   =hWndOwner;
                    156:     ofn.lpstrFile   =lpszFile;
                    157:     ofn.nMaxFile    =cchFile;
                    158:     ofn.lpstrFilter =(LPSTR)szFilters;
                    159:     ofn.nFilterIndex=1;
                    160:     if (LoadString(ghInst, IDS_BROWSE, (LPSTR)szDlgTitle, sizeof(szDlgTitle)))
                    161:         ofn.lpstrTitle  =(LPSTR)szDlgTitle;        
                    162:     ofn.hInstance = ghInst;
                    163:     ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEOPEN);
                    164:     if (NULL != lpszInitialDir)
                    165:       ofn.lpstrInitialDir = lpszInitialDir;
                    166: 
                    167:     ofn.Flags= OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | (dwOfnFlags) ;
                    168: 
                    169:     //On success, copy the chosen filename to the static display
                    170:     fStatus = GetOpenFileName((LPOPENFILENAME)&ofn);
                    171:         dwError = CommDlgExtendedError();
                    172:         return fStatus;
                    173: 
                    174:     }
                    175: 
                    176: 
                    177: 
                    178: 
                    179: 
                    180: /*
                    181:  * ReplaceCharWithNull
                    182:  *
                    183:  * Purpose:
                    184:  *  Walks a null-terminated string and replaces a given character
                    185:  *  with a zero.  Used to turn a single string for file open/save
                    186:  *  filters into the appropriate filter string as required by the
                    187:  *  common dialog API.
                    188:  *
                    189:  * Parameters:
                    190:  *  psz             LPSTR to the string to process.
                    191:  *  ch              int character to replace.
                    192:  *
                    193:  * Return Value:
                    194:  *  int             Number of characters replaced.  -1 if psz is NULL.
                    195:  */
                    196: 
                    197: int WINAPI ReplaceCharWithNull(LPSTR psz, int ch)
                    198:     {
                    199:     int             cChanged=-1;
                    200: 
                    201:     if (NULL!=psz)
                    202:         {
                    203:         while (0!=*psz)
                    204:             {
                    205:             if (ch==*psz)
                    206:                 {
                    207:                 *psz=0;
                    208:                 cChanged++;
                    209:                 }
                    210:             psz++;
                    211:             }
                    212:         }
                    213:     return cChanged;
                    214:     }
                    215: 
                    216: 
                    217: 
                    218: 
                    219: 
                    220: 
                    221: /*
                    222:  * ErrorWithFile
                    223:  *
                    224:  * Purpose:
                    225:  *  Displays a message box built from a stringtable string containing
                    226:  *  one %s as a placeholder for a filename and from a string of the
                    227:  *  filename to place there.
                    228:  *
                    229:  * Parameters:
                    230:  *  hWnd            HWND owning the message box.  The caption of this
                    231:  *                  window is the caption of the message box.
                    232:  *  hInst           HINSTANCE from which to draw the idsErr string.
                    233:  *  idsErr          UINT identifier of a stringtable string containing
                    234:  *                  the error message with a %s.
                    235:  *  lpszFile        LPSTR to the filename to include in the message.
                    236:  *  uFlags          UINT flags to pass to MessageBox, like MB_OK.
                    237:  *
                    238:  * Return Value:
                    239:  *  int             Return value from MessageBox.
                    240:  */
                    241: 
                    242: int WINAPI ErrorWithFile(HWND hWnd, HINSTANCE hInst, UINT idsErr
                    243:                   , LPSTR pszFile, UINT uFlags)
                    244:     {
                    245:     int             iRet=0;
                    246:     HANDLE          hMem;
                    247:     const UINT      cb=(2*OLEUI_CCHPATHMAX);
                    248:     LPSTR           psz1, psz2, psz3;
                    249: 
                    250:     if (NULL==hInst || NULL==pszFile)
                    251:         return iRet;
                    252: 
                    253:     //Allocate three 2*OLEUI_CCHPATHMAX byte work buffers
                    254:     hMem=GlobalAlloc(GHND, (DWORD)(3*cb));
                    255: 
                    256:     if (NULL==hMem)
                    257:         return iRet;
                    258: 
                    259:     psz1=GlobalLock(hMem);
                    260:     psz2=psz1+cb;
                    261:     psz3=psz2+cb;
                    262: 
                    263:     if (0!=LoadString(hInst, idsErr, psz1, cb))
                    264:         {
                    265:         wsprintf(psz2, psz1, pszFile);
                    266: 
                    267:         //Steal the caption of the dialog
                    268:         GetWindowText(hWnd, psz3, cb);
                    269:         iRet=MessageBox(hWnd, psz2, psz3, uFlags);
                    270:         }
                    271: 
                    272:     GlobalUnlock(hMem);
                    273:     GlobalFree(hMem);
                    274:     return iRet;
                    275:     }
                    276: 
                    277: 
                    278: 
                    279: 
                    280: 
                    281: 
                    282: 
                    283: 
                    284: 
                    285: /*
                    286:  * HIconFromClass
                    287:  *
                    288:  * Purpose:
                    289:  *  Given an object class name, finds an associated executable in the
                    290:  *  registration database and extracts the first icon from that
                    291:  *  executable.  If none is available or the class has no associated
                    292:  *  executable, this function returns NULL.
                    293:  *
                    294:  * Parameters:
                    295:  *  pszClass        LPSTR giving the object class to look up.
                    296:  *
                    297:  * Return Value:
                    298:  *  HICON           Handle to the extracted icon if there is a module
                    299:  *                  associated to pszClass.  NULL on failure to either
                    300:  *                  find the executable or extract and icon.
                    301:  */
                    302: 
                    303: HICON WINAPI HIconFromClass(LPSTR pszClass)
                    304:     {
                    305:     HICON           hIcon;
                    306:     char            szEXE[OLEUI_CCHPATHMAX];
                    307:     UINT            Index;
                    308:     CLSID           clsid;
                    309: 
                    310:     if (NULL==pszClass)
                    311:         return NULL;
                    312: 
                    313:     CLSIDFromString(pszClass, &clsid);
                    314: 
                    315:     if (!FIconFileFromClass((REFCLSID)&clsid, szEXE, sizeof(szEXE), &Index))
                    316:         return NULL;
                    317: 
                    318:     hIcon=ExtractIcon(ghInst, szEXE, Index);
                    319: 
                    320:     if ((HICON)32 > hIcon)
                    321:         hIcon=NULL;
                    322:    
                    323:     return hIcon;
                    324:     }
                    325: 
                    326: 
                    327: 
                    328: 
                    329: 
                    330: /*
                    331:  * FServerFromClass
                    332:  *
                    333:  * Purpose:
                    334:  *  Looks up the classname in the registration database and retrieves
                    335:  *  the name undet protocol\StdFileEditing\server.
                    336:  *
                    337:  * Parameters:
                    338:  *  pszClass        LPSTR to the classname to look up.
                    339:  *  pszEXE          LPSTR at which to store the server name
                    340:  *  cch             UINT size of pszEXE
                    341:  *
                    342:  * Return Value:
                    343:  *  BOOL            TRUE if one or more characters were loaded into pszEXE.
                    344:  *                  FALSE otherwise.
                    345:  */
                    346: 
                    347: BOOL WINAPI FServerFromClass(LPSTR pszClass, LPSTR pszEXE, UINT cch)
                    348: {
                    349: 
                    350:     DWORD       dw;
                    351:     LONG        lRet;
                    352:     HKEY        hKey;
                    353: 
                    354:     if (NULL==pszClass || NULL==pszEXE || 0==cch)
                    355:         return FALSE;
                    356: 
                    357:     /*
                    358:      * We have to go walking in the registration database under the
                    359:      * classname, so we first open the classname key and then check
                    360:      * under "\\LocalServer" to get the .EXE.
                    361:      */
                    362: 
                    363:     //Open up the class key
                    364:     lRet=RegOpenKey(HKEY_CLASSES_ROOT, pszClass, &hKey);
                    365: 
                    366:     if ((LONG)ERROR_SUCCESS!=lRet)
                    367:         return FALSE;
                    368: 
                    369:     //Get the executable path.
                    370:     dw=(DWORD)cch;
                    371:     lRet=RegQueryValue(hKey, "LocalServer", pszEXE, &dw);
                    372: 
                    373:     RegCloseKey(hKey);
                    374: 
                    375:     return ((ERROR_SUCCESS == lRet) && (dw > 0));
                    376: }
                    377: 
                    378: 
                    379: 
                    380: /*
                    381:  * UClassFromDescription
                    382:  *
                    383:  * Purpose:
                    384:  *  Looks up the actual OLE class name in the registration database
                    385:  *  for the given descriptive name chosen from a listbox.
                    386:  *
                    387:  * Parameters:
                    388:  *  psz             LPSTR to the descriptive name.
                    389:  *  pszClass        LPSTR in which to store the class name.
                    390:  *  cb              UINT maximum length of pszClass.
                    391:  *
                    392:  * Return Value:
                    393:  *  UINT            Number of characters copied to pszClass.  0 on failure.
                    394:  */
                    395: 
                    396: UINT WINAPI UClassFromDescription(LPSTR psz, LPSTR pszClass, UINT cb)
                    397:     {
                    398:     DWORD           dw;
                    399:     HKEY            hKey;
                    400:     char            szClass[OLEUI_CCHKEYMAX];
                    401:     LONG            lRet;
                    402:     UINT            i;
                    403: 
                    404:     //Open up the root key.
                    405:     lRet=RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey);
                    406: 
                    407:     if ((LONG)ERROR_SUCCESS!=lRet)
                    408:         return 0;
                    409: 
                    410:     i=0;
                    411:     lRet=RegEnumKey(hKey, i++, szClass, OLEUI_CCHKEYMAX);
                    412: 
                    413:     //Walk the available keys
                    414:     while ((LONG)ERROR_SUCCESS==lRet)
                    415:         {
                    416:         dw=(DWORD)cb;
                    417:         lRet=RegQueryValue(hKey, szClass, pszClass, &dw);
                    418: 
                    419:         //Check if the description matches the one just enumerated
                    420:         if ((LONG)ERROR_SUCCESS==lRet)
                    421:             {
                    422:             if (!lstrcmp(pszClass, psz))
                    423:                 break;
                    424:             }
                    425: 
                    426:         //Continue with the next key.
                    427:         lRet=RegEnumKey(hKey, i++, szClass, OLEUI_CCHKEYMAX);
                    428:         }
                    429: 
                    430:     //If we found it, copy to the return buffer
                    431:     if ((LONG)ERROR_SUCCESS==lRet)
                    432:         lstrcpy(pszClass, szClass);
                    433:     else
                    434:         dw=0L;
                    435: 
                    436:     RegCloseKey(hKey);
                    437:     return (UINT)dw;
                    438:     }
                    439: 
                    440: 
                    441: 
                    442: 
                    443: 
                    444: 
                    445: 
                    446: 
                    447: /*
                    448:  * UDescriptionFromClass
                    449:  *
                    450:  * Purpose:
                    451:  *  Looks up the actual OLE descriptive name name in the registration
                    452:  *  database for the given class name.
                    453:  *
                    454:  * Parameters:
                    455:  *  pszClass        LPSTR to the class name.
                    456:  *  psz             LPSTR in which to store the descriptive name.
                    457:  *  cb              UINT maximum length of psz.
                    458:  *
                    459:  * Return Value:
                    460:  *  UINT            Number of characters copied to pszClass.  0 on failure.
                    461:  */
                    462: 
                    463: UINT WINAPI UDescriptionFromClass(LPSTR pszClass, LPSTR psz, UINT cb)
                    464:     {
                    465:     DWORD           dw;
                    466:     HKEY            hKey;
                    467:     LONG            lRet;
                    468: 
                    469:     if (NULL==pszClass || NULL==psz)
                    470:         return 0;
                    471: 
                    472:     //Open up the root key.
                    473:     lRet=RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey);
                    474: 
                    475:     if ((LONG)ERROR_SUCCESS!=lRet)
                    476:         return 0;
                    477: 
                    478:     //Get the descriptive name using the class name.
                    479:     dw=(DWORD)cb;
                    480:     lRet=RegQueryValue(hKey, pszClass, psz, &dw);
                    481: 
                    482:     RegCloseKey(hKey);
                    483: 
                    484:     psz+=lstrlen(psz)+1;
                    485:     *psz=0;
                    486: 
                    487:     if ((LONG)ERROR_SUCCESS!=lRet)
                    488:         return 0;
                    489: 
                    490:     return (UINT)dw;
                    491:     }
                    492: 
                    493: 
                    494: 
                    495: 
                    496: 
                    497: /*
                    498:  * FVerbGet
                    499:  *
                    500:  * Purpose:
                    501:  *  Function to retrieve the verb of a given index from the registration
                    502:  *  database from a given classname.
                    503:  *
                    504:  * Parameters:
                    505:  *  lpszClass       LPSTR of the class to look up.
                    506:  *  iVerb           UINT index of the verb to retrieve
                    507:  *  lpszVerb        LPSTR where to store the retrieved verb.
                    508:  *
                    509:  * Return Value
                    510:  *  BOOL            TRUE if the verb was retrieved, FALSE otherwise.
                    511:  */
                    512: 
                    513: BOOL WINAPI FVerbGet(LPSTR lpszClass, UINT iVerb, LPSTR lpszVerb)
                    514:     {
                    515:     static char     szVerb [OLEUI_CCHVERBMAX];
                    516: 
                    517:     wsprintf((LPSTR)szVerb, "VERB %d", iVerb);
                    518: 
                    519:     return GetPrivateProfileString(lpszClass, (LPSTR)szVerb, NULL
                    520:                                    , lpszVerb, OLEUI_CCHVERBMAX, "ole2.ini");
                    521:     }
                    522: 
                    523: 
                    524: // returns height of line of text. this is a support routine for ChopText
                    525: static LONG GetTextHSize(HDC hDC, LPSTR lpsz)
                    526: {
                    527:     SIZE size;
                    528:     
                    529:     if (GetTextExtentPoint(hDC, lpsz, lstrlen(lpsz), (LPSIZE)&size)) 
                    530:         return size.cy;
                    531:     else {
                    532:         return 0;
                    533:     }
                    534: }
                    535: 
                    536: 
                    537: /*
                    538:  * ChopText
                    539:  *
                    540:  * Purpose:
                    541:  *  Parse a string (pathname) and convert it to be within a specified 
                    542:  *  length by chopping the least significant part
                    543:  *
                    544:  * Parameters:
                    545:  *  hWnd            window handle in which the string resides
                    546:  *  nWidth          max width of string in pixels
                    547:  *                  use width of hWnd if zero
                    548:  *  lpch            pointer to beginning of the string
                    549:  *
                    550:  * Return Value:
                    551:  *  pointer to the modified string
                    552:  */
                    553: LPSTR WINAPI ChopText(HWND hWnd, int nWidth, LPSTR lpch)
                    554: {
                    555: #define PREFIX_SIZE    7 + 1
                    556: #define PREFIX_FORMAT "%c%c%c...\\"
                    557: 
                    558:     char    szPrefix[PREFIX_SIZE];
                    559:     BOOL    fDone = FALSE;
                    560:     int     i;
                    561:     RECT    rc;
                    562:     HDC     hdc;
                    563:     HFONT   hfont;
                    564:     HFONT   hfontOld = NULL;
                    565:     
                    566:     if (!hWnd || !lpch)
                    567:         return NULL;
                    568: 
                    569:     /* Get length of static field. */
                    570:     if (!nWidth) {
                    571:         GetClientRect(hWnd, (LPRECT)&rc);
                    572:         nWidth = rc.right - rc.left;
                    573:     }
                    574: 
                    575:     /* Set up DC appropriately for the static control */
                    576:     hdc = GetDC(hWnd);
                    577:     hfont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0L);
                    578: 
                    579:    if (NULL != hfont)   // WM_GETFONT returns NULL if window uses system font
                    580:        hfontOld = SelectObject(hdc, hfont);
                    581: 
                    582:     /* check horizontal extent of string */
                    583:     if (GetTextHSize(hdc, lpch) > nWidth) {
                    584:         
                    585:         /* string is too long to fit in static control; chop it */
                    586:         /* set up new prefix & determine remaining space in control */
                    587:         wsprintf((LPSTR) szPrefix, PREFIX_FORMAT, lpch[0], lpch[1], lpch[2]);
                    588:         nWidth -= (int)GetTextHSize(hdc, (LPSTR) szPrefix);
                    589:     
                    590:         /* 
                    591:         ** advance a directory at a time until the remainder of the
                    592:         ** string fits into the static control after the "x:\...\" prefix
                    593:         */
                    594:         while (!fDone) {
                    595:           
                    596: #ifdef DBCS
                    597:             while (*lpch && (*lpch != '\\'))
                    598:                 lpch = AnsiNext(lpch);
                    599:             if (*lpch)
                    600:                 lpch = AnsiNext(lpch);
                    601: #else
                    602:             while (*lpch && (*lpch++ != '\\'));
                    603: #endif
                    604: 
                    605:             if (!*lpch || GetTextHSize(hdc, lpch) <= nWidth) {
                    606:                 if (!*lpch)
                    607:                     /*
                    608:                     ** Nothing could fit after the prefix; remove the
                    609:                     ** final "\" from the prefix
                    610:                     */
                    611:                     szPrefix[lstrlen((LPSTR) szPrefix) - 1] = 0;
                    612: 
                    613:                     /* rest or string fits -- stick prefix on front */
                    614:                     for (i = lstrlen((LPSTR) szPrefix) - 1; i >= 0; --i)
                    615:                         *--lpch = szPrefix[i];
                    616:                     fDone = TRUE;
                    617:             }
                    618:         }
                    619:     }        
                    620: 
                    621:    if (NULL != hfont)
                    622:       SelectObject(hdc, hfontOld);
                    623:     ReleaseDC(hWnd, hdc);
                    624:      
                    625:     return(lpch);
                    626:   
                    627: #undef PREFIX_SIZE
                    628: #undef PREFIX_FORMAT
                    629: }
                    630: 
                    631: 
                    632: /*
                    633:  * OpenFileError
                    634:  *
                    635:  * Purpose:
                    636:  *  display message for error returned from OpenFile
                    637:  *
                    638:  * Parameters:
                    639:  *  hDlg            HWND of the dialog.
                    640:  *  nErrCode        UINT error code returned in OFSTRUCT passed to OpenFile
                    641:  *  lpszFile        LPSTR file name passed to OpenFile
                    642:  *
                    643:  * Return Value:
                    644:  *  None
                    645:  */
                    646: void WINAPI OpenFileError(HWND hDlg, UINT nErrCode, LPSTR lpszFile)
                    647: {
                    648:     switch (nErrCode) {
                    649:         case 0x0005:    // Access denied
                    650:             ErrorWithFile(hDlg, ghInst, IDS_CIFILEACCESS, lpszFile, MB_OK);
                    651:             break;
                    652: 
                    653:         case 0x0020:    // Sharing violation
                    654:             ErrorWithFile(hDlg, ghInst, IDS_CIFILESHARE, lpszFile, MB_OK);
                    655:             break;
                    656: 
                    657:         case 0x0002:    // File not found
                    658:         case 0x0003:    // Path not found
                    659:             ErrorWithFile(hDlg, ghInst, IDS_CIINVALIDFILE, lpszFile, MB_OK);
                    660:             break;
                    661: 
                    662:         default:
                    663:             ErrorWithFile(hDlg, ghInst, IDS_CIFILEOPENFAIL, lpszFile, MB_OK);
                    664:             break;
                    665:     }
                    666: }
                    667: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.