#define INCL_DOS #define INCL_DOSERRORS #define INCL_WIN #define INCL_GPI #include #include #include #include #include #include #include #include #include #include #include "fm3dll.h" #include "fm3dlg.h" #include "fm3str.h" #include "mle.h" #pragma data_seg(DATA1) #pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint) #pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren) #pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton) #pragma alloc_text(COMMON3,CommonMainWndProc) #pragma alloc_text(COMMON4,CommonCnrProc) #pragma alloc_text(COMMON5,OpenDirCnr) MRESULT EXPENTRY CommonFrameWndProc (USHORT id, HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { PFNWP oldproc = (PFNWP)WinQueryWindowPtr(hwnd,0); switch(msg) { case UM_TIMER: case UM_ACTION: case UM_SHOWME: case UM_OPENWINDOWFORME: case UM_MINIMIZE: case UM_MAXIMIZE: case UM_CONTAINERDIR: case UM_FILTER: case UM_INITMENU: case UM_COMMAND: case UM_UPDATERECORD: case UM_UPDATERECORDLIST: case WM_COMMAND: case MM_PORTHOLEINIT: case WM_INITMENU: case UM_CONTAINER_FILLED: case UM_FILESMENU: return WinSendMsg(WinWindowFromID(hwnd,FID_CLIENT),msg,mp1,mp2); case UM_CONTEXTMENU: PostMsg(WinWindowFromID(hwnd,FID_CLIENT),msg,mp1,mp2); return 0; case UM_CONTAINERHWND: return MRFROMLONG(WinWindowFromID(hwnd,id)); case DM_DROP: case DM_DRAGOVER: case DM_DRAGLEAVE: case DM_DROPHELP: { CNRDRAGINFO cnd; USHORT dcmd; switch(msg) { case DM_DROP: dcmd = CN_DROP; break; case DM_DRAGOVER: dcmd = CN_DRAGOVER; break; case DM_DRAGLEAVE: dcmd = CN_DRAGLEAVE; break; case DM_DROPHELP: dcmd = CN_DROPHELP; break; } cnd.pDragInfo = (PDRAGINFO)mp1; cnd.pRecord = NULL; return WinSendMsg(WinWindowFromID(hwnd,FID_CLIENT), WM_CONTROL, MPFROM2SHORT(id,dcmd), MPFROMP(&cnd)); } case UM_RESCAN: if(fAutoTile && !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd,(HWND)0)) PostMsg(WinQueryWindow(hwnd,QW_PARENT), UM_RESCAN, MPVOID, MPVOID); return 0; case WM_MINMAXFRAME: { PSWP pswp = (PSWP)mp1; MRESULT rc; rc = oldproc(hwnd,msg,mp1,mp2); if(pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE)) WinSendMsg(hwnd,UM_RESCAN,MPVOID,MPVOID); return rc; } case WM_DESTROY: WinSendMsg(hwnd,UM_RESCAN,MPVOID,MPVOID); break; } return oldproc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY CommonTextProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { switch(msg) { case WM_CREATE: { MRESULT rc; char font[] = "8.Helv"; rc = PFNWPStatic(hwnd,msg,mp1,mp2); switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case DIR_SORT: case DIR_VIEW: case DIR_FILTER: *font = '7'; } SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, font); return rc; } } return PFNWPStatic(hwnd,msg,mp1,mp2); } void CommonTextPaint (HWND hwnd,HPS hps) { int x; USHORT ids[] = {DIR_FOLDERICON,DIR_TOTALS,DIR_SELECTED,DIR_VIEW, DIR_FILTER,DIR_SORT,DIR_MAX,0}; BOOL bools[] = {TRUE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE}; for(x = 0;ids[x];x++) { if(WinWindowFromID(hwnd,ids[x]) != (HWND)0) PaintRecessedWindow(WinWindowFromID(hwnd,ids[x]),hps, bools[x],FALSE); } } void CommonCreateTextChildren (HWND hwnd,char *class,USHORT *ids) { int x; CHAR s[33]; ULONG attrs; if(!hwnd || !class || !ids) return; for(x = 0;ids[x];x++) { *s = 0; switch(ids[x]) { case DIR_SORT: case DIR_FILTER: case DIR_VIEW: attrs = SS_TEXT | DT_LEFT | DT_VCENTER; break; case DIR_FOLDERICON: case DIR_MAX: attrs = SS_BITMAP; sprintf(s,"#%d",ids[x]); break; default: attrs = SS_TEXT | DT_CENTER | DT_VCENTER; break; } WinCreateWindow(hwnd,class,s,attrs,0,0,0,0,hwnd, HWND_TOP,ids[x],NULL,NULL); } } void CommonDriveCmd (HWND hwnd,char *drive,USHORT cmd) { char dv[CCHMAXPATH]; if(!drive || !*drive) return; strcpy(dv,drive); MakeValidDir(dv); switch(cmd) { case IDM_MKDIR: PMMkDir(hwnd, dv, FALSE); break; case IDM_INFO: WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID)dv); break; case IDM_DRVFLAGS: if(WinDlgBox(HWND_DESKTOP, hwnd, SetDrvProc, FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree) PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE,0), MPVOID); break; case IDM_SIZES: WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv); break; case IDM_SHOWALLFILES: StartSeeAll(HWND_DESKTOP, FALSE, dv); break; case IDM_UNDELETE: WinDlgBox(HWND_DESKTOP, hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv)); break; case IDM_CHKDSK: runemf2(SEPARATE | WINDOWED, hwnd, NULL, NULL, "PMCHKDSK.EXE %c:", toupper(*dv)); break; case IDM_OPTIMIZE: { CHAR FileSystem[CCHMAXPATH]; ULONG type; CheckDrive(*dv,FileSystem,&type); if(*FileSystem) { strcat(FileSystem,"OPT.CMD"); runemf2(SEPARATE | WINDOWED, hwnd, NULL, NULL, "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv)); } } break; case IDM_FORMAT: runemf2(SEPARATE | WINDOWED, hwnd, NULL, NULL, "PMFORMAT.EXE %c:", toupper(*dv)); break; /* case IDM_CLOSETRAY: if(driveflags[*dv - 'A'] & DRIVE_CDROM) { BYTE parm[4] = {"CD01"}; ULONG dlen,plen; HFILE hfile; APIRET rc; dv[2] = 0; rc = DosOpen(dv, &hfile, &dlen, 0, 0, OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW, OPEN_FLAGS_DASD | OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL); if(!rc) { dlen = 0; plen = sizeof(parm); rc = DosDevIOCtl(hfile, 0x80, 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen); DosClose(hfile); if(rc) saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"rc2 = %lu",rc); } else saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"rc = %lu",rc); } break; */ case IDM_LOCK: case IDM_UNLOCK: case IDM_EJECT: { BYTE parm[2]; ULONG plen = sizeof(parm),dlen = 0L; switch(SHORT1FROMMP(cmd)) { case IDM_LOCK: parm[0] = 1; break; case IDM_UNLOCK: parm[0] = 0; break; case IDM_EJECT: parm[0] = 2; break; } parm[1] = (BYTE)(*dv - 'A'); DosError(FERR_DISABLEHARDERR); DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen); } break; } } void CommonCreateMainChildren (HWND hwnd,SWP *swp) { hwndStatus = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCSTATUS), "Status", WS_VISIBLE | SS_TEXT | DT_LEFT | DT_VCENTER, swp->x + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), swp->y + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER), ((swp->cx / 2) - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 20, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_STATUS, NULL, NULL); hwndStatus2 = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCSTATUS), "Status2", WS_VISIBLE | SS_TEXT | DT_LEFT | DT_VCENTER, ((swp->cx / 2) + 4) + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), ((swp->cy / 2) + 4) + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER), ((swp->cx / 2) - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 20, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_STATUS2, NULL, NULL); hwndAttr = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCSTATUS), "Attr", WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER, swp->x + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), swp->y + 4 + 24 + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER), ((swp->cx / 4) - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 20, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, IDM_ATTRS, NULL, NULL); hwndDate = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCSTATUS), "Date", WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER, ((swp->x / 4) * 2) + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), swp->y + 4 + 24 + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER), ((swp->cx / 4) - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 20, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, IDM_INFO, NULL, NULL); hwndName = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCSTATUS), "Name", WS_VISIBLE | SS_TEXT | DT_LEFT | DT_VCENTER, ((swp->x / 4) * 3) + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), swp->y + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER), ((swp->cx / 4) - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 20, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, IDM_RENAME, NULL, NULL); WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCTOOLBACK), NullStr, WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER, swp->x + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), (swp->cy - WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER)) - 30, swp->cx - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 30, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_TOOLS, NULL, NULL); hwndBack = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCDRIVEBACK), NullStr, WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM, swp->x + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), (swp->cy - WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER)) - 30, swp->cx - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 30, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_DRIVES, NULL, NULL); hwndLED = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCLED), "#920", WS_VISIBLE | SS_BITMAP, swp->cx - 58, swp->y, 12, 12, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_LED, NULL, NULL); hwndLEDHdr = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCLED), "0", WS_VISIBLE | SS_TEXT | DT_VCENTER | DT_CENTER, swp->cx - 58, swp->y + 12, 12, 12, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_LEDHDR, NULL, NULL); hwndAutoview = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), GetPString(IDS_WCAUTOVIEW), NullStr, WS_VISIBLE | SS_TEXT | DT_LEFT | DT_TOP | DT_WORDBREAK, swp->x + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), swp->y + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) + 16, (swp->cx - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 48, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_AUTOVIEW, NULL, NULL); hwndAutoMLE = WinCreateWindow(WinQueryWindow(hwnd,QW_PARENT), // GetPString(IDS_WCAUTOVIEW), WC_MLE, NullStr, WS_VISIBLE | MLS_HSCROLL | MLS_VSCROLL | MLS_BORDER, swp->x + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER), swp->y + 4 + WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER) + 16, (swp->cx - 8) - (WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER) * 2), 48, WinQueryWindow(hwnd,QW_PARENT), HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL); { PFNWP oldproc; oldproc = WinSubclassWindow(hwndAutoMLE,(PFNWP)AutoViewProc); WinSetWindowPtr(hwndAutoMLE,0,(PVOID)oldproc); PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID); } } MRESULT EXPENTRY CommonMainWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { switch(msg) { case UM_THREADUSE: if(hbmLEDon && hbmLEDoff) { static LONG threaduse = 0; CHAR ts[33]; if(mp1) { threaduse++; if(threaduse == 1) WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID); } else { threaduse--; if(threaduse <= 0) { threaduse = 0; WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID); } } ltoa(threaduse, ts, 10); WinSetWindowText(hwndLEDHdr, ts); } return 0; case UM_LOADFILE: { CHAR *s = NULL; static CHAR lastfile[CCHMAXPATH] = ""; if(!fAutoView) { if(*lastfile) PostMsg((fComments) ? hwndAutoMLE : hwndAutoview, UM_LOADFILE, MPVOID, MPVOID); *lastfile = 0; } else { if(mp1) { if(!mp2 && !stricmp(lastfile,(CHAR *)mp1)) return 0; strcpy(lastfile,(CHAR *)mp1); s = strdup(lastfile); } else *lastfile = 0; if(!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview, UM_LOADFILE, MPFROMP(s), MPVOID)) { if(s) free(s); } } } return 0; case UM_BUILDDRIVES: BuildDrives(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), MAIN_DRIVES)); return 0; } return WinDefWindowProc(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY CommonTextButton (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { static HWND hwndLast = (HWND)0; static ULONG lastclick = 0; switch(msg) { case WM_MOUSEMOVE: shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL)); if(!fNoFinger) { WinSetPointer(HWND_DESKTOP,hptrFinger); return MRFROMLONG(TRUE); } break; case WM_BUTTON1DOWN: case WM_BUTTON3DOWN: if(hwndBubble) WinDestroyWindow(hwndBubble); shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL)); WinSetCapture(HWND_DESKTOP,hwnd); PaintRecessedWindow(hwnd,(HPS)0,FALSE,FALSE); break; case WM_BUTTON2UP: case WM_BUTTON2DOWN: shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL)); if(msg == WM_BUTTON2UP && hwndLast) { PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID); hwndLast = (HWND)0; } break; case WM_BUTTON1UP: case WM_BUTTON3UP: shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL)); WinSetCapture(HWND_DESKTOP, (HWND)0); PaintRecessedWindow(hwnd, (HPS)0, TRUE, FALSE); { ULONG check; DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check)); if(check > lastclick + 500) { RECTL rcl; POINTS pts; pts.x = SHORT1FROMMP(mp1); pts.y = SHORT2FROMMP(mp1); WinQueryWindowRect(hwnd,&rcl); if(pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop) PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2); } lastclick = check; } PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID); hwndLast = (HWND)0; break; case WM_SETFOCUS: if(mp2) hwndLast = (HWND)mp1; break; case UM_FOCUSME: if(mp1) { PID pid; TID tid; if(WinIsWindow(WinQueryAnchorBlock(hwnd),(HWND)mp1) && WinQueryWindowProcess((HWND)mp1,&pid,&tid) && pid == mypid) { WinSetFocus(HWND_DESKTOP, (HWND)mp1); return 0; } } { HWND htemp = (HWND)0; if(hwndMain) htemp = TopWindow(hwndMain,(HWND)0); if(!htemp) htemp = hwndTree; if(htemp) WinSetFocus(HWND_DESKTOP,htemp); else WinSetFocus(HWND_DESKTOP,WinQueryWindow(hwnd,QW_PARENT)); } return 0; } return PFNWPStatic(hwnd,msg,mp1,mp2); } MRESULT EXPENTRY CommonCnrProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd,0); switch(msg) { case UM_FIXCNRMLE: if(dcd) { SWP swp,swpC; if(WinQueryWindowPos(WinWindowFromID(hwnd,CID_MLE),&swp)) { if(WinQueryWindowPos(hwnd,&swpC)) { swpC.cx -= (WinQuerySysValue(HWND_DESKTOP,SV_CXVSCROLL) + 4); swpC.cx -= swp.x; WinSetWindowPos(WinWindowFromID(hwnd,CID_MLE), HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE); } } if(mp1) WinSendMsg(WinWindowFromID(hwnd,CID_MLE), MLM_SETTEXTLIMIT, mp1, MPVOID); } return 0; case UM_FIXEDITNAME: if(dcd) { if(mp1 && (INT)mp1 != -1) { CHAR *p; WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID); MLEdelete(WinWindowFromID(hwnd,CID_MLE), 0, strlen((CHAR *)mp1) + 1); WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1); p = strrchr((CHAR *)mp1,'\\'); if(p) { p++; MLEsetcurposa(WinWindowFromID(hwnd,CID_MLE), (p - (CHAR *)mp1)); MLEsetcurposc(WinWindowFromID(hwnd,CID_MLE), strlen((CHAR *)mp1)); } else MLEsetcurpos(WinWindowFromID(hwnd,CID_MLE), strlen((CHAR *)mp1)); } else if(mp2) { if((INT)mp1 == -1) { PCNRITEM pci = (PCNRITEM)mp2; WinSendMsg(hwnd, CM_REMOVERECORD, MPFROMP(&pci), MPFROM2SHORT(1,CMA_FREE | CMA_INVALIDATE)); } else { Broadcast(WinQueryAnchorBlock(hwnd), dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID); free(mp2); } } } return 0; } return PFNWPCnr(hwnd,msg,mp1,mp2); } HWND OpenDirCnr (HWND hwnd,HWND hwndParent,HWND hwndRestore, BOOL noautotile,char *directory) { SWP swp; HWND hwndDir; if(ParentIsDesktop(hwnd,hwndParent) || *(ULONG *)realappname != FM3UL) StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1); else if(*(ULONG *)realappname == FM3UL) { if(!fAutoTile) GetNextWindowPos(hwndParent, &swp, NULL, NULL); hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1); if(hwndDir) { if(!fAutoTile) WinSetWindowPos(hwndDir, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER); else if(!noautotile) TileChildren(hwndParent, TRUE); WinSetWindowPos(hwndDir, HWND_TOP, 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE); } } else { char s[256]; assign_ignores(s); runemf2(WINDOWED | SEPARATE, hwnd, NULL, NULL, "VDIR.EXE %s%s\"%s%s\"", (*s) ? s : NullStr,(*s) ? " " : NullStr, directory, (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr); } return hwndDir; }