Annotation of mstools/samples/sdktools/ddespy/ddespy.c, revision 1.1

1.1     ! root        1: /****************************************************************************
        !             2: 
        !             3:     PROGRAM: DdeSpy.c
        !             4: 
        !             5: ****************************************************************************/
        !             6: 
        !             7: #include <windows.h>                /* required for all Windows applications */
        !             8: #include <windowsx.h>
        !             9: #include <shellapi.h>
        !            10: #include <dde.h>
        !            11: #include <stdio.h>
        !            12: #include <io.h>
        !            13: #include <errno.h>
        !            14: #include <string.h>
        !            15: #include <stdlib.h>
        !            16: #include <ctype.h>
        !            17: #include "ddespy.h"
        !            18: #include "lists.h"
        !            19: 
        !            20: /* GLOBAL Variables used for DDESPY */
        !            21: 
        !            22: UINT        idInst = 0;
        !            23: HANDLE      hInst;
        !            24: HICON       hIcon;
        !            25: HWND        hWndString = NULL;
        !            26: HWND        hwndSpy = NULL;
        !            27: INT         fhOutput = 0;
        !            28: OFSTRUCT    ofsOpen;
        !            29: CHAR        OpenName[MAX_FNAME + 1];
        !            30: CHAR        TBuf[BUFFER_SIZE];
        !            31: CHAR        TBuf2[BUFFER_SIZE];
        !            32: CHAR        szNULL[] = "";
        !            33: PSTR        apszResources[IDS_LAST + 1];
        !            34: PFNCALLBACK pfnDdeCallback = NULL;
        !            35: HWND        hwndTrack[IT_COUNT] = { 0 };
        !            36: PSTR        TrackTitle[IT_COUNT];
        !            37: BOOL        fBlockMsg[WM_DDE_LAST - WM_DDE_FIRST + 1] = { 0 };
        !            38: BOOL        fBlockCb[15] = { 0 };
        !            39: PSTR        TrackHeading[IT_COUNT];
        !            40: struct {                           /* profile data */
        !            41:     BOOL fOutput[IO_COUNT];
        !            42:     BOOL fFilter[IF_COUNT];
        !            43:     BOOL fTrack[IT_COUNT];
        !            44:     BOOL fTerse;
        !            45: } pro;
        !            46: 
        !            47: 
        !            48: 
        !            49: BOOL LoadResourceStrings()
        !            50: {
        !            51:     int i, cbLeft, cbRes;
        !            52:     PSTR psz;
        !            53: 
        !            54:     cbLeft = 0x1000;
        !            55:     psz = LocalAlloc(LPTR, cbLeft);
        !            56:     for (i = 0; i <= IDS_LAST; i++) {
        !            57:         apszResources[i] = psz;
        !            58:         cbRes = LoadString(hInst, i, psz, cbLeft) + 1;
        !            59:         cbLeft -= cbRes;
        !            60:         psz += cbRes;
        !            61:     }
        !            62:     for (i = 0; i < IT_COUNT; i++) {
        !            63:         TrackTitle[i] = RefString(IDS_TRACKTITLE_1 + i);
        !            64:         TrackHeading[i] = RefString(IDS_TRACKHEADING_1 + i);
        !            65:     }
        !            66:     strcpy(TBuf, RefString(IDS_DEFAULT_OUTPUT_FNAME));
        !            67:     GetFullPathName(TBuf, sizeof(OpenName), OpenName, (LPTSTR *)TBuf2);
        !            68:     return(TRUE);
        !            69: }
        !            70: 
        !            71: 
        !            72: 
        !            73: int WINAPI WinMain(
        !            74:         HINSTANCE hInstance,
        !            75:         HINSTANCE hPrevInstance,
        !            76:         LPSTR lpCmdLine,
        !            77:         int nCmdShow)
        !            78: {
        !            79:     MSG msg;
        !            80: 
        !            81:     UNREFERENCED_PARAMETER(lpCmdLine);
        !            82: 
        !            83:     hInst = hInstance;
        !            84: 
        !            85:     if (!LoadResourceStrings()) {
        !            86:         return (FALSE);
        !            87:     }
        !            88: 
        !            89:     if (!hPrevInstance)
        !            90:         if (!InitApplication(hInstance)) /* Initialize shared things */
        !            91:             return (FALSE);              /* Exits if unable to initialize    */
        !            92: 
        !            93:     /* Perform initializations that apply to a specific instance */
        !            94: 
        !            95:     if (!InitInstance(hInstance, nCmdShow)) {
        !            96:         CloseApp();
        !            97:         return (FALSE);
        !            98:     }
        !            99: 
        !           100:     /* Acquire and dispatch messages until a WM_QUIT message is received. */
        !           101: 
        !           102:     while (GetMessage(&msg,        /* message structure                      */
        !           103:             NULL,                  /* handle of window receiving the message */
        !           104:             0,                     /* lowest message to examine              */
        !           105:             0))                    /* highest message to examine             */
        !           106:         {
        !           107:         TranslateMessage(&msg);    /* Translates virtual key codes           */
        !           108:         DispatchMessage(&msg);     /* Dispatches message to window           */
        !           109:     }
        !           110:     CloseApp();
        !           111:     return (msg.wParam);           /* Returns the value from PostQuitMessage */
        !           112: }
        !           113: 
        !           114: 
        !           115: 
        !           116: BOOL InitApplication(HINSTANCE hInstance)
        !           117: {
        !           118:     WNDCLASS  wc;
        !           119: 
        !           120:     if (!InitTestSubs())                        
        !           121:         return(FALSE);
        !           122: 
        !           123:     /* Fill in window class structure with parameters that describe the       */
        !           124:     /* main window.                                                           */
        !           125: 
        !           126:     wc.style = 0;                    /* Class style(s).                    */
        !           127:     wc.lpfnWndProc = (WNDPROC)MainWndProc;       /* Function to retrieve messages for  */
        !           128:                                         /* windows of this class.             */
        !           129:     wc.cbClsExtra = 0;                  /* No per-class extra data.           */
        !           130:     wc.cbWndExtra = 0;                  /* No per-window extra data.          */
        !           131:     wc.hInstance = hInstance;           /* Application that owns the class.   */
        !           132:     hIcon = wc.hIcon = LoadIcon(hInstance, RefString(IDS_TITLE));
        !           133:     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        !           134:     wc.hbrBackground = GetStockObject(WHITE_BRUSH);
        !           135:     wc.lpszMenuName =  MAKEINTRESOURCE(IDR_MENU);   /* Name of menu resource in .RC file. */
        !           136:     wc.lpszClassName = RefString(IDS_CLASS);
        !           137: 
        !           138:     /* Register the window class and return success/failure code. */
        !           139: 
        !           140:     return (RegisterClass(&wc));
        !           141: }
        !           142: 
        !           143: 
        !           144: BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
        !           145: {
        !           146:     RECT            Rect;
        !           147:     INT             i;
        !           148: 
        !           149:     /* Save the instance handle in static variable, which will be used in  */
        !           150:     /* many subsequence calls from this application to Windows.            */
        !           151: 
        !           152:     pfnDdeCallback = (PFNCALLBACK)MakeProcInstance((FARPROC)DdeCallback,
        !           153:             hInstance);
        !           154: 
        !           155:     GetProfile();
        !           156: 
        !           157:     /* Create a main window for this application instance.  */
        !           158: 
        !           159:     hwndSpy = CreateWindow(
        !           160:         RefString(IDS_CLASS),
        !           161:         RefString(IDS_TITLE),
        !           162:         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        !           163:         CW_USEDEFAULT,                  /* Default horizontal position.       */
        !           164:         CW_USEDEFAULT,                  /* Default vertical position.         */
        !           165:         CW_USEDEFAULT,                  /* Default width.                     */
        !           166:         CW_USEDEFAULT,                  /* Default height.                    */
        !           167:         NULL,                           /* Overlapped windows have no parent. */
        !           168:         NULL,                           /* Use the window class menu.         */
        !           169:         hInstance,                      /* This instance owns this window.    */
        !           170:         NULL                            /* Pointer not needed.                */
        !           171:     );
        !           172: 
        !           173: 
        !           174:     GetClientRect(hwndSpy, (LPRECT) &Rect);
        !           175: 
        !           176:     hWndString = CreateWindow(          /* String Window (class Registered in Teststubs)*/
        !           177:         RefString(IDS_STRINGCLASS), 
        !           178:         szNULL,
        !           179:         WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL,
        !           180:         0,
        !           181:         0,
        !           182:         Rect.right - Rect.left,
        !           183:         Rect.bottom - Rect.top,
        !           184:         hwndSpy, 
        !           185:         NULL, 
        !           186:         hInst, 
        !           187:         (LPSTR)MAKELONG(CCHARS, CLINES));
        !           188: 
        !           189:     for (i = 0; i < IT_COUNT; i++) {
        !           190:         if (pro.fTrack[i]) {
        !           191:             pro.fTrack[i] = FALSE;
        !           192:             SendMessage(hwndSpy, WM_COMMAND,
        !           193:                     GET_WM_COMMAND_MPS(IDM_TRACK_FIRST + i, 0, 0));
        !           194:         }
        !           195:     }
        !           196: 
        !           197:     if (!hwndSpy || !hWndString) {
        !           198:         CloseApp();
        !           199:         return (FALSE);
        !           200:     }
        !           201: 
        !           202:     /* Make the window visible; update its client area; and return "success" */
        !           203: 
        !           204:     ShowWindow(hwndSpy, nCmdShow);  /* Show the window                        */
        !           205:     UpdateWindow(hwndSpy);          /* Sends WM_PAINT message                 */
        !           206: 
        !           207:     if (SetFilters()) {
        !           208:         return(FALSE);
        !           209:     }
        !           210: 
        !           211:     return(TRUE);
        !           212: }
        !           213: 
        !           214: 
        !           215: VOID CloseApp()
        !           216: {
        !           217:     DdeUninitialize(idInst);        /* perform cleanup and store profile */
        !           218:     SaveProfile();
        !           219:     if (fhOutput)
        !           220:         _lclose(fhOutput);
        !           221:     UnregisterClass(RefString(IDS_CLASS), hInst);
        !           222:     CloseTestSubs(hInst);
        !           223: }
        !           224: 
        !           225: 
        !           226: 
        !           227: LONG  CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        !           228: {
        !           229:     int i;
        !           230: 
        !           231:     switch (message) {
        !           232:     case WM_CREATE:
        !           233:         LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCEL));
        !           234:         if (pro.fOutput[IO_FILE])
        !           235:             pro.fOutput[IO_FILE] = fhOutput =
        !           236:                     DoDialog(MAKEINTRESOURCE(IDD_OPEN), (DLGPROC)OpenDlg, 0, TRUE, hWnd, hInst);
        !           237:         break;
        !           238: 
        !           239:     case WM_INITMENU:
        !           240:         if (GetMenu(hWnd) != (HMENU)wParam)
        !           241:             break;
        !           242: 
        !           243:         for (i = 0; i < IO_COUNT; i++) {
        !           244:         CheckMenuItem((HMENU)wParam, IDM_OUTPUT_FIRST + i,
        !           245:                 pro.fOutput[i] ? MF_CHECKED : MF_UNCHECKED);
        !           246:         }
        !           247: 
        !           248:         for (i = 0; i < IF_COUNT; i++) {
        !           249:             CheckMenuItem((HMENU)wParam, IDM_FILTER_FIRST + i,
        !           250:                 pro.fFilter[i] ? MF_CHECKED : MF_UNCHECKED);
        !           251:         }
        !           252: 
        !           253:         for (i = 0; i < IT_COUNT; i++) {
        !           254:             CheckMenuItem((HMENU)wParam, IDM_TRACK_FIRST + i,
        !           255:                 pro.fTrack[i] ? MF_CHECKED : MF_UNCHECKED);
        !           256:         }
        !           257:         break;
        !           258: 
        !           259:     case WM_COMMAND:           /* message: command from application menu */
        !           260:         switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        !           261:         case IDM_OUTPUT_FILE:
        !           262:         case IDM_OUTPUT_DEBUG:
        !           263:         case IDM_OUTPUT_SCREEN:
        !           264:             switch (wParam) {
        !           265:             case IDM_OUTPUT_FILE:
        !           266:                 if (fhOutput) {
        !           267:                     wsprintf(TBuf, RefString(IDS_QCLOSEFILE_TEXT), OpenName);
        !           268:                     if (IDYES != MessageBox(hWnd,
        !           269:                             TBuf, RefString(IDS_QCLOSEFILE_CAPTION),
        !           270:                             MB_YESNO | MB_ICONQUESTION)) {
        !           271:                         break;
        !           272:                     }
        !           273:                     _lclose(fhOutput);
        !           274:                 }
        !           275:                 pro.fOutput[IO_FILE] = fhOutput =
        !           276:                         DoDialog(MAKEINTRESOURCE(IDD_OPEN), (DLGPROC)OpenDlg, 0, TRUE, hWnd, hInst);
        !           277:                 break;
        !           278: 
        !           279:             case IDM_OUTPUT_DEBUG:
        !           280:                 pro.fOutput[IO_DEBUG] = !pro.fOutput[IO_DEBUG];
        !           281:                 break;
        !           282: 
        !           283:             case IDM_OUTPUT_SCREEN:
        !           284:                 pro.fOutput[IO_SCREEN] = !pro.fOutput[IO_SCREEN];
        !           285:                 break;
        !           286: 
        !           287:             }
        !           288:             break;
        !           289: 
        !           290:         case IDM_CLEARSCREEN:
        !           291:             if (hWndString) {
        !           292:                 HANDLE hpsw;
        !           293:                 STRWND *psw;
        !           294: 
        !           295:                 hpsw = (HANDLE)GetWindowLong(hWndString, 0);
        !           296:                 psw = (STRWND *)LocalLock(hpsw);
        !           297:                 ClearScreen(psw);
        !           298:                 LocalUnlock(hpsw);
        !           299:                 InvalidateRect(hWndString, NULL, TRUE);
        !           300:             }
        !           301:             break;
        !           302: 
        !           303:         case IDM_MARK:
        !           304:             DoDialog(MAKEINTRESOURCE(IDD_VALUEENTRY), (DLGPROC)MarkDlgProc, 0, TRUE, hWnd, hInst);
        !           305:             break;
        !           306: 
        !           307:         case IDM_FILTER_HSZINFO:
        !           308:         case IDM_FILTER_INIT_TERM:
        !           309:         case IDM_FILTER_DDEMSGS:
        !           310:         case IDM_FILTER_CALLBACKS:
        !           311:         case IDM_FILTER_ERRORS:
        !           312:             pro.fFilter[wParam - IDM_FILTER_FIRST] =
        !           313:                     !pro.fFilter[wParam - IDM_FILTER_FIRST];
        !           314:             SetFilters();
        !           315:             break;
        !           316: 
        !           317:         case IDM_FILTER_DIALOG:
        !           318:             DoDialog(MAKEINTRESOURCE(IDD_MSGFILTERS), (DLGPROC)FilterDlgProc, 0, TRUE, hWnd, hInst);
        !           319:             break;
        !           320: 
        !           321:         case IDM_TRACK_HSZS:
        !           322:         case IDM_TRACK_CONVS:
        !           323:         case IDM_TRACK_LINKS:
        !           324:         case IDM_TRACK_SVRS:
        !           325:             pro.fTrack[wParam - IDM_TRACK_FIRST] =
        !           326:                     !pro.fTrack[wParam - IDM_TRACK_FIRST];
        !           327:             if (pro.fTrack[wParam - IDM_TRACK_FIRST]) {
        !           328:                 hwndTrack[wParam - IDM_TRACK_FIRST] = CreateMCLBFrame(
        !           329:                         NULL,
        !           330:                         TrackTitle[wParam - IDM_TRACK_FIRST],
        !           331:                         WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MINIMIZE,
        !           332:                         hIcon, (HBRUSH)(COLOR_APPWORKSPACE + 1),
        !           333:                         TrackHeading[wParam - IDM_TRACK_FIRST]);
        !           334:             } else {
        !           335:                 DestroyWindow(hwndTrack[wParam - IDM_TRACK_FIRST]);
        !           336:                 hwndTrack[wParam - IDM_TRACK_FIRST] = 0;
        !           337:             }
        !           338:             SetFilters();
        !           339:             break;
        !           340: 
        !           341:         case IDM_ABOUT:
        !           342:             DoDialog(MAKEINTRESOURCE(IDD_ABOUTBOX), (DLGPROC)About, 0, TRUE, hWnd, hInst);
        !           343:             break;
        !           344: 
        !           345:         default:
        !           346:             return (DefWindowProc(hWnd, message, wParam, lParam));
        !           347:         }
        !           348:         break;
        !           349: 
        !           350:     case WM_DESTROY:                  /* message: window being destroyed */
        !           351:         for (i = IDM_TRACK_FIRST; i <= IDM_TRACK_LAST; i++) {
        !           352:             if (pro.fTrack[i - IDM_TRACK_FIRST]) {
        !           353:                 DestroyWindow(hwndTrack[i - IDM_TRACK_FIRST]);
        !           354:                 hwndTrack[i - IDM_TRACK_FIRST] = 0;
        !           355:             }
        !           356:         }
        !           357:         PostQuitMessage(0);
        !           358:         break;
        !           359: 
        !           360:     case WM_SIZE:
        !           361:         if (hWndString) {
        !           362:             RECT rc;
        !           363: 
        !           364:             GetClientRect(hWnd, &rc);
        !           365:             MoveWindow(hWndString, 0, 0, rc.right, rc.bottom, TRUE);
        !           366:         }
        !           367:         // fall through
        !           368:     default:
        !           369:         return (DefWindowProc(hWnd, message, wParam, lParam));
        !           370:     }
        !           371:     return (0);
        !           372: }
        !           373: 
        !           374: 
        !           375: 
        !           376: 
        !           377: 
        !           378: BOOL  CALLBACK About(
        !           379:                     HWND hDlg,
        !           380:                     UINT message,
        !           381:                     WPARAM wParam,
        !           382:                     LPARAM lParam)
        !           383: {
        !           384:     switch (message) {
        !           385:         case WM_INITDIALOG:                /* message: initialize dialog box */
        !           386:             return (TRUE);
        !           387: 
        !           388:         case WM_COMMAND:                      /* message: received a command */
        !           389:             if (GET_WM_COMMAND_ID(wParam, lParam) == IDOK
        !           390:                 || GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL) {
        !           391:                 EndDialog(hDlg, TRUE);        /* Exits the dialog box        */
        !           392:                 return (TRUE);
        !           393:             }
        !           394:             break;
        !           395:     }
        !           396:     return (FALSE);                           /* Didn't process a message    */
        !           397: }
        !           398: 
        !           399: 
        !           400: HDDEDATA CALLBACK DdeCallback(
        !           401:                             UINT wType,
        !           402:                             UINT wFmt,
        !           403:                             HCONV hConv,
        !           404:                             HSZ hsz1,
        !           405:                             HSZ hsz2,
        !           406:                             HDDEDATA hData,
        !           407:                             UINT dwData1,
        !           408:                             UINT dwData2)
        !           409: {
        !           410:     LPVOID pData;
        !           411:     UINT cb;
        !           412:     CHAR *psz1, *psz2, *psz3;
        !           413:     CHAR *szAction;
        !           414:     INT i;
        !           415:     BOOL fInt = FALSE;
        !           416:     wFmt;
        !           417:     hConv;
        !           418:     dwData1;
        !           419: 
        !           420:     switch (wType) {
        !           421:     case XTYP_MONITOR:
        !           422:     if (pData = DdeAccessData(hData, (LPDWORD)&cb)) {
        !           423:         switch (dwData2) {
        !           424:         case MF_HSZ_INFO:
        !           425:             if (pro.fTrack[IT_HSZS]) {
        !           426:                 switch (((MONHSZSTRUCT FAR *)pData)->fsAction) {
        !           427:                 case MH_DELETE:
        !           428:                     wsprintf(TBuf, fInt ? "0x%lx\t*\t%s(int)" : "0x%lx\t*\t%s",
        !           429:                             ((MONHSZSTRUCT FAR *)pData)->hsz, 
        !           430:                             (LPSTR)((MONHSZSTRUCT FAR *)pData)->str);
        !           431:                     i = GetMCLBColValue(TBuf, hwndTrack[IT_HSZS], 2);
        !           432:                     if (i > 1) {
        !           433:                         wsprintf(TBuf2, fInt ? "0x%lx\t%d\t%s(int)" : "0x%lx\t%d\t%s",
        !           434:                                 ((MONHSZSTRUCT FAR *)pData)->hsz,
        !           435:                                  i - 1,
        !           436:                                  (LPSTR)((MONHSZSTRUCT FAR *)pData)->str);
        !           437:                         AddMCLBText(TBuf, TBuf2, hwndTrack[IT_HSZS]);
        !           438:                     } else if (i == 1) {
        !           439:                         DeleteMCLBText(TBuf, hwndTrack[IT_HSZS]);
        !           440:                     }
        !           441:                     break;
        !           442: 
        !           443:                 case MH_KEEP:
        !           444:                 case MH_CREATE:
        !           445:                     wsprintf(TBuf, fInt ? "0x%lx\t*\t%s(int)" : "0x%lx\t*\t%s",
        !           446:                             ((MONHSZSTRUCT FAR *)pData)->hsz,
        !           447:                             (LPSTR)((MONHSZSTRUCT FAR *)pData)->str);
        !           448:                     i = GetMCLBColValue(TBuf, hwndTrack[IT_HSZS], 2) + 1;
        !           449:                     wsprintf(TBuf2, fInt ? "0x%lx\t%d\t%s(int)" : "0x%lx\t%d\t%s",
        !           450:                             ((MONHSZSTRUCT FAR *)pData)->hsz,
        !           451:                              i,
        !           452:                              (LPSTR)((MONHSZSTRUCT FAR *)pData)->str);
        !           453:                     AddMCLBText(TBuf, TBuf2, hwndTrack[IT_HSZS]);
        !           454:                 }
        !           455:             }
        !           456: 
        !           457:             if (!pro.fFilter[IF_HSZ]) {
        !           458:                 return(0);
        !           459:             }
        !           460: 
        !           461:             switch (((MONHSZSTRUCT FAR *)pData)->fsAction) {
        !           462:             case MH_CLEANUP:
        !           463:                 szAction = RefString(IDS_ACTION_CLEANEDUP);
        !           464:                 break;
        !           465: 
        !           466:             case MH_DELETE:
        !           467:                 szAction = RefString(IDS_ACTION_DESTROYED);
        !           468:                 break;
        !           469: 
        !           470:             case MH_KEEP:
        !           471:                 szAction = RefString(IDS_ACTION_INCREMENTED);
        !           472:                 break;
        !           473: 
        !           474:             case MH_CREATE:
        !           475:                 szAction = RefString(IDS_ACTION_CREATED);
        !           476:                 break;
        !           477: 
        !           478:             default:
        !           479:                 DdeUnaccessData(hData);
        !           480:                 return(0);
        !           481:             }
        !           482:             if (pro.fTerse) {
        !           483:                 wsprintf(TBuf, "[%x:%ld] HSZ %s: %lx(%s)",
        !           484:                         ((MONHSZSTRUCT FAR *)pData)->hTask,
        !           485:                         ((MONHSZSTRUCT FAR *)pData)->dwTime,
        !           486:                         (LPSTR)szAction,
        !           487:                         ((MONHSZSTRUCT FAR *)pData)->hsz,
        !           488:                         (LPSTR)((MONHSZSTRUCT FAR *)pData)->str);
        !           489:             } else {
        !           490:                 wsprintf(TBuf, "Task:0x%x, Time:%ld, String Handle %s: %lx(%s)",
        !           491:                         ((MONHSZSTRUCT FAR *)pData)->hTask,
        !           492:                         ((MONHSZSTRUCT FAR *)pData)->dwTime,
        !           493:                         (LPSTR)szAction,
        !           494:                         ((MONHSZSTRUCT FAR *)pData)->hsz,
        !           495:                         (LPSTR)((MONHSZSTRUCT FAR *)pData)->str);
        !           496:             }
        !           497:             break;
        !           498: 
        !           499: 
        !           500:         case MF_SENDMSGS:
        !           501:         case MF_POSTMSGS:
        !           502:             if (fBlockMsg[((MONMSGSTRUCT FAR *)pData)->wMsg - WM_DDE_FIRST]) {
        !           503:                 return(0);
        !           504:             }
        !           505:             if (pro.fTerse) {
        !           506:                 wsprintf(TBuf, RefString(IDS_FMT_TRS_MSG1),
        !           507:                         ((MONMSGSTRUCT FAR *)pData)->hTask,
        !           508:                         ((MONMSGSTRUCT FAR *)pData)->dwTime,
        !           509:                         ((MONMSGSTRUCT FAR *)pData)->wParam,
        !           510:                         ((MONMSGSTRUCT FAR *)pData)->hwndTo,
        !           511:                         (dwData2 == MF_SENDMSGS) ? RefString(IDS_SENT) : RefString(IDS_POSTED),
        !           512:                         (LPSTR)DdeMsg2String(((MONMSGSTRUCT FAR *)pData)->wMsg));
        !           513:             } else {
        !           514:                 wsprintf(TBuf, RefString(IDS_FMT_MSG1),
        !           515:                         ((MONMSGSTRUCT FAR *)pData)->hTask, 
        !           516:                         ((MONMSGSTRUCT FAR *)pData)->dwTime, 
        !           517:                         ((MONMSGSTRUCT FAR *)pData)->hwndTo,
        !           518:                         (dwData2 == MF_SENDMSGS) ? RefString(IDS_SENT) : RefString(IDS_POSTED),
        !           519:                         (LPSTR)DdeMsg2String(((MONMSGSTRUCT FAR *)pData)->wMsg));
        !           520:             }
        !           521:             OutputString(TBuf);
        !           522:             wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_MSG2) : RefString(IDS_FMT_MSG2), 
        !           523:                         ((MONMSGSTRUCT FAR *)pData)->wParam);
        !           524:             DisectMsgLP(((MONMSGSTRUCT FAR *)pData)->wMsg, 
        !           525:                         ((MONMSGSTRUCT FAR *)pData), 
        !           526:                         &TBuf[strlen(TBuf)]);
        !           527:             break;
        !           528: 
        !           529: 
        !           530:         case MF_CALLBACKS:
        !           531:             if (fBlockCb[(((MONCBSTRUCT FAR *)pData)->wType & XTYP_MASK) >> XTYP_SHIFT]) {
        !           532:                 return(0);
        !           533:             }
        !           534:             wsprintf(TBuf,
        !           535:                     pro.fTerse ? RefString(IDS_FMT_TRS_CB1) : RefString(IDS_FMT_CB1),
        !           536:                     ((MONCBSTRUCT FAR *)pData)->hTask,
        !           537:                     ((MONCBSTRUCT FAR *)pData)->dwTime,
        !           538:                     (LPSTR)Type2String(((MONCBSTRUCT FAR *)pData)->wType));
        !           539:             wsprintf(DumpFormat(((MONCBSTRUCT FAR *)pData)->wFmt, &TBuf[strlen(TBuf)]),
        !           540:                     pro.fTerse ? RefString(IDS_FMT_TRS_CB2) : RefString(IDS_FMT_CB2),
        !           541:                     (UINT)((MONCBSTRUCT FAR *)pData)->hConv,
        !           542:                     ((MONCBSTRUCT FAR *)pData)->hsz1,
        !           543:                     (LPSTR)(psz1 = GetHszName(((MONCBSTRUCT FAR *)pData)->hsz1)),
        !           544:                     ((MONCBSTRUCT FAR *)pData)->hsz2,
        !           545:                     (LPSTR)(psz2 = GetHszName(((MONCBSTRUCT FAR *)pData)->hsz2)),
        !           546:                     ((MONCBSTRUCT FAR *)pData)->hData, 
        !           547:                     ((MONCBSTRUCT FAR *)pData)->dwData1, 
        !           548:                     ((MONCBSTRUCT FAR *)pData)->dwData2, 
        !           549:                     ((MONCBSTRUCT FAR *)pData)->dwRet);
        !           550:             MyFree(psz1);
        !           551:             MyFree(psz2);
        !           552:             OutputString(TBuf);
        !           553:             if (((MONCBSTRUCT FAR *)pData)->dwData1 && 
        !           554:                (((MONCBSTRUCT FAR *)pData)->wType == XTYP_CONNECT ||
        !           555:                ((MONCBSTRUCT FAR *)pData)->wType == XTYP_WILDCONNECT)) {
        !           556:                 // display proposed context
        !           557:                 wsprintf(TBuf,
        !           558:                     pro.fTerse ? RefString(IDS_FMT_TRS_CTXT1) : RefString(IDS_FMT_CTXT1),
        !           559:                     ((MONCBSTRUCT FAR *)pData)->cc.wFlags,
        !           560:                     ((MONCBSTRUCT FAR *)pData)->cc.wCountryID,
        !           561:                     ((MONCBSTRUCT FAR *)pData)->cc.iCodePage,
        !           562:                     ((MONCBSTRUCT FAR *)pData)->cc.dwLangID,
        !           563:                     ((MONCBSTRUCT FAR *)pData)->cc.dwSecurity,
        !           564:                     ((MONCBSTRUCT FAR *)pData)->cc.qos.ImpersonationLevel,
        !           565:                     ((MONCBSTRUCT FAR *)pData)->cc.qos.ContextTrackingMode,
        !           566:                     ((MONCBSTRUCT FAR *)pData)->cc.qos.EffectiveOnly);
        !           567:                 OutputString(TBuf);
        !           568:             }
        !           569:             if (((MONCBSTRUCT FAR *)pData)->hData && ((MONCBSTRUCT FAR *)pData)->cbData) {
        !           570:                 wsprintf(TBuf, RefString(IDS_INPUT_DATA));
        !           571:                 OutputString(TBuf);
        !           572:                 DumpData((LPBYTE)((MONCBSTRUCT FAR *)pData)->Data, 
        !           573:                                  ((MONCBSTRUCT FAR *)pData)->cbData, 
        !           574:                                  TBuf, 
        !           575:                                  ((MONCBSTRUCT FAR *)pData)->wFmt);
        !           576:                 OutputString(TBuf);
        !           577:                 if (cb > MAX_DISPDATA)
        !           578:                     OutputString(RefString(IDS_TABDDD));
        !           579:                 DdeUnaccessData(((MONCBSTRUCT FAR *)pData)->hData);
        !           580:             }
        !           581:             if ((((MONCBSTRUCT FAR *)pData)->wType & XCLASS_DATA) && 
        !           582:                  ((MONCBSTRUCT FAR *)pData)->dwRet && 
        !           583:                  ((MONCBSTRUCT FAR *)pData)->cbData) {
        !           584:                 wsprintf(TBuf, RefString(IDS_OUTPUT_DATA));
        !           585:                 OutputString(TBuf);
        !           586:                 DumpData((LPBYTE)((MONCBSTRUCT FAR *)pData)->Data, 
        !           587:                                  ((MONCBSTRUCT FAR *)pData)->cbData, 
        !           588:                                  TBuf, 
        !           589:                                  ((MONCBSTRUCT FAR *)pData)->wFmt);
        !           590:                 OutputString(TBuf);
        !           591:                 if (cb > MAX_DISPDATA)
        !           592:                     OutputString(RefString(IDS_TABDDD));
        !           593:                 DdeUnaccessData(((MONCBSTRUCT FAR *)pData)->dwRet);
        !           594:             }
        !           595:             DdeUnaccessData(hData);
        !           596:             return(0);
        !           597:             break;
        !           598: 
        !           599:         case MF_ERRORS:
        !           600:             wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_ER1) : RefString(IDS_FMT_ER1),
        !           601:                     ((MONERRSTRUCT FAR *)pData)->hTask,
        !           602:                     ((MONERRSTRUCT FAR *)pData)->dwTime, 
        !           603:                     ((MONERRSTRUCT FAR *)pData)->wLastError,
        !           604:                     (LPSTR)Error2String(((MONERRSTRUCT FAR *)pData)->wLastError));
        !           605:             break;
        !           606: 
        !           607: 
        !           608:         case MF_LINKS:
        !           609:             psz1 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszSvc);
        !           610:             psz2 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszTopic);
        !           611:             psz3 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszItem);
        !           612:             if (!GetClipboardFormatName(((MONLINKSTRUCT FAR *)pData)->wFmt, TBuf2, BUFFER_SIZE))
        !           613:                 strcpy(TBuf2, pdf(((MONLINKSTRUCT FAR *)pData)->wFmt));
        !           614:             if (!strcmp(RefString(IDS_HUH), TBuf2)) {
        !           615:                 wsprintf(TBuf2, "%d", ((MONLINKSTRUCT FAR *)pData)->wFmt);
        !           616:             }
        !           617: 
        !           618:             wsprintf(TBuf, "%s\t%s\t%s\t%s\t%s\t%lx\t%lx",
        !           619:                     (LPSTR)psz1, (LPSTR)psz2, (LPSTR)psz3,
        !           620:                     (LPSTR)TBuf2,
        !           621:                     ((MONLINKSTRUCT FAR *)pData)->fNoData ? 
        !           622:                      RefString(IDS_WARM) : RefString(IDS_HOT),
        !           623:                     ((MONLINKSTRUCT FAR *)pData)->hConvClient, 
        !           624:                     ((MONLINKSTRUCT FAR *)pData)->hConvServer);
        !           625: 
        !           626:             if (((MONLINKSTRUCT FAR *)pData)->fEstablished) {
        !           627:                 AddMCLBText(TBuf, TBuf, hwndTrack[IT_LINKS]);
        !           628:             } else {
        !           629:                 DeleteMCLBText(TBuf, hwndTrack[IT_LINKS]);
        !           630:             }
        !           631: 
        !           632:             MyFree(psz1);
        !           633:             MyFree(psz2);
        !           634:             MyFree(psz3);
        !           635:             DdeUnaccessData(hData);
        !           636:             return(0);
        !           637: 
        !           638: 
        !           639:         case MF_CONV:
        !           640:             psz1 = GetHszName(((MONCONVSTRUCT FAR *)pData)->hszSvc);
        !           641:             psz2 = GetHszName(((MONCONVSTRUCT FAR *)pData)->hszTopic);
        !           642: 
        !           643:             wsprintf(TBuf, "%s\t%s\t%lx\t%lx",
        !           644:                     (LPSTR)psz1, (LPSTR)psz2, 
        !           645:                     ((MONCONVSTRUCT FAR *)pData)->hConvClient,
        !           646:                     ((MONCONVSTRUCT FAR *)pData)->hConvServer);
        !           647: 
        !           648:             if (((MONCONVSTRUCT FAR *)pData)->fConnect) {
        !           649:                 AddMCLBText(TBuf, TBuf, hwndTrack[IT_CONVS]);
        !           650:             } else {
        !           651:                 DeleteMCLBText(TBuf, hwndTrack[IT_CONVS]);
        !           652:             }
        !           653: 
        !           654:             MyFree(psz1);
        !           655:             MyFree(psz2);
        !           656:             DdeUnaccessData(hData);
        !           657:             return(0);
        !           658: 
        !           659: 
        !           660:         default:
        !           661:             strcpy(TBuf, RefString(IDS_UNKNOWN_CALLBACK));
        !           662:         }
        !           663:         DdeUnaccessData(hData);
        !           664:         OutputString(TBuf);
        !           665:     }
        !           666:     break;
        !           667: 
        !           668:     case XTYP_REGISTER:
        !           669:     case XTYP_UNREGISTER:
        !           670:         if (!pro.fTrack[IT_SVRS]) {
        !           671:             return(0);
        !           672:         }
        !           673:         psz1 = GetHszName(hsz1);
        !           674:         psz2 = GetHszName(hsz2);
        !           675:         wsprintf(TBuf, "%s\t%s", (LPSTR)psz1, (LPSTR)psz2);
        !           676:         if (wType == XTYP_REGISTER) {
        !           677:             AddMCLBText(NULL, TBuf, hwndTrack[IT_SVRS]);
        !           678:         } else {
        !           679:             DeleteMCLBText(TBuf, hwndTrack[IT_SVRS]);
        !           680:         }
        !           681:         MyFree(psz1);
        !           682:         MyFree(psz2);
        !           683:         break;
        !           684:     }
        !           685:     return(0);
        !           686: }
        !           687: 
        !           688: 
        !           689: PSTR DisectMsgLP(UINT msg, MONMSGSTRUCT *pmms,  PSTR pszBuf)
        !           690: {
        !           691:     static LONG m2t[] = {
        !           692: 
        !           693:     /*              LOW                       HIGH */
        !           694: 
        !           695:         MAKELONG(T_APP | T_ATOM,        T_TOPIC | T_ATOM),  // WM_DDE_INITIATE
        !           696:         0,                                                  // WM_DDE_TERMINATE
        !           697:         MAKELONG(T_OPTIONHANDLE,        T_ITEM | T_ATOM),   // WM_DDE_ADVISE
        !           698:         MAKELONG(T_FORMAT,              T_ITEM | T_ATOM),   // WM_DDE_UNADVISE
        !           699:         MAKELONG(T_APP | T_ATOM | T_OR | T_STATUS,
        !           700:                                         T_TOPIC | T_ITEM | T_ATOM | T_OR | T_STRINGHANDLE),
        !           701:                                                             // WM_DDE_ACK
        !           702:         MAKELONG(T_DATAHANDLE,          T_ITEM | T_ATOM),   // WM_DDE_DATA
        !           703:         MAKELONG(T_FORMAT,              T_ITEM | T_ATOM),   // WM_DDE_REQUEST
        !           704:         MAKELONG(T_DATAHANDLE,          T_ITEM | T_ATOM),   // WM_DDE_POKE
        !           705:         MAKELONG(0,                     T_STRINGHANDLE),    // WM_DDE_EXECUTE
        !           706:     };
        !           707: 
        !           708:     // ASSUMED: msg is a valid DDE message!!!
        !           709: 
        !           710:     pszBuf = DisectWord(LOWORD(m2t[msg - WM_DDE_FIRST]), 
        !           711:                         pmms->dmhd.uiLo, &pmms->dmhd, pszBuf);
        !           712:     *pszBuf++ = '\r';
        !           713:     *pszBuf++ = '\n';
        !           714:     *pszBuf++ = '\t';
        !           715:     return(DisectWord(HIWORD(m2t[msg - WM_DDE_FIRST]), 
        !           716:                         pmms->dmhd.uiHi, &pmms->dmhd, pszBuf));
        !           717: }
        !           718: 
        !           719: 
        !           720: 
        !           721: 
        !           722: /*
        !           723:  * Allocates local memory for and retrieves the string form of an HSZ.
        !           724:  * Returns a pointer to the local memory or NULL if failure.
        !           725:  * The string must be freed via MyFree().
        !           726:  */
        !           727: PSTR GetHszName(HSZ hsz)
        !           728: {
        !           729:     PSTR psz;
        !           730:     UINT cb;
        !           731: 
        !           732:     cb = (UINT)DdeQueryString(idInst, hsz, NULL, 0, 0) + 1;
        !           733:     psz = MyAlloc(cb);
        !           734:     DdeQueryString(idInst, hsz, psz, cb, 0);
        !           735:     return(psz);
        !           736: }
        !           737: 
        !           738: 
        !           739: 
        !           740: 
        !           741: PSTR DisectWord( UINT type,
        !           742:                  UINT data,
        !           743:                  DDEML_MSG_HOOK_DATA *pdmhd,
        !           744:                 PSTR pstr)
        !           745: {
        !           746:     UINT wT;
        !           747:     CHAR szData[32]; // for truncating strings w/o disturbing the hDdeData
        !           748: 
        !           749:     *pstr = '\0';   // in case we do nothing.
        !           750: 
        !           751:     if (type & T_ATOM) {
        !           752:         wT = GlobalGetAtomName((ATOM)data, (LPSTR)pstr, 25);
        !           753:         if (wT || data == 0) {
        !           754:             if (type & T_APP) {
        !           755:                 strcpy(pstr, RefString(IDS_APPIS));
        !           756:                 pstr += strlen(pstr);
        !           757:             }
        !           758: 
        !           759:             if (type & T_TOPIC) {
        !           760:                 strcpy(pstr, RefString(IDS_TOPICIS));
        !           761:                 pstr += strlen(pstr);
        !           762:             }
        !           763: 
        !           764:             if (type & T_ITEM) {
        !           765:                 strcpy(pstr, RefString(IDS_ITEMIS));
        !           766:                 pstr += strlen(pstr);
        !           767:             }
        !           768:         }
        !           769:         if (wT) {
        !           770:             wsprintf(pstr, "0x%x(\"", data);
        !           771:             pstr += strlen(pstr);
        !           772:             GlobalGetAtomName((ATOM)data, (LPSTR)pstr, 25);
        !           773:             pstr += wT;
        !           774:             if (wT == 25) {
        !           775:                 *pstr++ = '.';
        !           776:                 *pstr++ = '.';
        !           777:                 *pstr++ = '.';
        !           778:             }
        !           779:             *pstr++ = '\"';
        !           780:             *pstr++ = ')';
        !           781:             *pstr = '\0';
        !           782:             type &= ~(T_OR | T_STRINGHANDLE);  // its an atom, so its not an object!
        !           783:         } else if (data == 0) {     // could be a wild atom
        !           784:             *pstr++ = '*';
        !           785:             *pstr = '\0';
        !           786:         } else if (type & T_OR) {
        !           787:             type &= ~T_OR;   // not an atom, must be somthin else.
        !           788:         } else {
        !           789:             wsprintf(pstr, "Bad Atom (0x%x)", data);
        !           790:             pstr += strlen(pstr);
        !           791:         }
        !           792:     }
        !           793: 
        !           794:     if (type & T_OR) {
        !           795:         strcpy(pstr, RefString(IDS_OR));
        !           796:         pstr += strlen(pstr);
        !           797:     }
        !           798: 
        !           799: 
        !           800:     if (type & T_OPTIONHANDLE) {
        !           801:         if (pdmhd->cbData >= 4) {
        !           802:             wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(pdmhd->Data[0]));
        !           803:             pstr += strlen(pstr);
        !           804:             if (LOWORD(pdmhd->Data[0]) & DDE_FACKREQ) {
        !           805:                 strcpy(pstr, RefString(IDS_FACKREQ));
        !           806:                 pstr += strlen(pstr);
        !           807:             }
        !           808:             if (LOWORD(pdmhd->Data[0]) & DDE_FDEFERUPD) {
        !           809:                 strcpy(pstr, RefString(IDS_DEFERUPD));
        !           810:                 pstr += strlen(pstr);
        !           811:             }
        !           812:             *pstr++ = ')';
        !           813:             *pstr++ = ' ';
        !           814:             pstr = DumpFormat((UINT)HIWORD(pdmhd->Data[0]), pstr);
        !           815:         }
        !           816:     }
        !           817: 
        !           818:     if (type & T_FORMAT) {
        !           819:         pstr = DumpFormat(data, pstr);
        !           820:     }
        !           821: 
        !           822:     if (type & T_STATUS) {
        !           823:         wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(data));
        !           824:         pstr += strlen(pstr);
        !           825:         if (data & DDE_FACK) {
        !           826:             strcpy(pstr, RefString(IDS_FACK));
        !           827:             pstr += strlen(pstr);
        !           828:         }
        !           829:         if (data & DDE_FBUSY) {
        !           830:             strcpy(pstr, RefString(IDS_FBUSY));
        !           831:             pstr += strlen(pstr);
        !           832:         }
        !           833:         *pstr++ = ')';
        !           834:         *pstr = '\0';
        !           835:     }
        !           836: 
        !           837:     if (type & T_STRINGHANDLE && pdmhd->cbData) {
        !           838:         memcpy(szData, pdmhd->Data, min(32, pdmhd->cbData));
        !           839:         szData[31] = '\0';
        !           840:         wsprintf(pstr, pro.fTerse ? 
        !           841:                     RefString(IDS_FMT_TRS_EXEC1) : RefString(IDS_FMT_EXEC1), szData);
        !           842:         pstr += strlen(pstr);
        !           843:         *pstr = '\0';
        !           844:     }
        !           845: 
        !           846:     if (type & T_DATAHANDLE && pdmhd->cbData) {
        !           847:         wsprintf(pstr, pro.fTerse ? 
        !           848:                     RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), 
        !           849:                     LOWORD(pdmhd->Data[0]));
        !           850:         pstr += strlen(pstr);
        !           851:         if (LOWORD(pdmhd->Data[0]) & DDE_FRELEASE) {
        !           852:             strcpy(pstr, RefString(IDS_FRELEASE));
        !           853:             pstr += strlen(pstr);
        !           854:         }
        !           855:         if (LOWORD(pdmhd->Data[0]) & DDE_FREQUESTED) {
        !           856:             lstrcpy(pstr, RefString(IDS_FREQUESTED));
        !           857:             pstr += strlen(pstr);
        !           858:         }
        !           859:         *pstr++ = ')';
        !           860:         *pstr++ = ' ';
        !           861:         pstr = DumpFormat(HIWORD(pdmhd->Data[0]), pstr);
        !           862:         strcpy(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_DATAIS1) : RefString(IDS_FMT_DATAIS1));
        !           863:         pstr += strlen(pstr);
        !           864:         pstr = DumpData((LPBYTE)&pdmhd->Data[1], min(28, pdmhd->cbData - 4),
        !           865:                 pstr, HIWORD(pdmhd->Data[0]));
        !           866:     }
        !           867:     return(pstr);
        !           868: }
        !           869: 
        !           870: 
        !           871: PSTR pdf(UINT fmt)
        !           872: {
        !           873:     INT i;
        !           874:     static struct {
        !           875:         UINT fmt;
        !           876:         PSTR psz;
        !           877:     } fmts[] = {
        !           878:         { CF_TEXT             ,     "CF_TEXT"           }   ,
        !           879:         { CF_BITMAP           ,     "CF_BITMAP"         }   ,
        !           880:         { CF_METAFILEPICT     ,     "CF_METAFILEPICT"   }   ,
        !           881:         { CF_ENHMETAFILE      ,     "CF_ENHMETAFILE"    }   ,
        !           882:         { CF_SYLK             ,     "CF_SYLK"           }   ,
        !           883:         { CF_DIF              ,     "CF_DIF"            }   ,
        !           884:         { CF_TIFF             ,     "CF_TIFF"           }   ,
        !           885:         { CF_OEMTEXT          ,     "CF_OEMTEXT"        }   ,
        !           886:         { CF_DIB              ,     "CF_DIB"            }   ,
        !           887:         { CF_PALETTE          ,     "CF_PALETTE"        }   ,
        !           888:     };
        !           889:     for (i = 0; i < 10; i++)
        !           890:         if (fmts[i].fmt == fmt)
        !           891:             return(fmts[i].psz);
        !           892:     return(RefString(IDS_HUH));
        !           893: }
        !           894: 
        !           895: 
        !           896: 
        !           897: PSTR DumpFormat(UINT fmt, PSTR pstr)
        !           898: {
        !           899:     UINT cb;
        !           900: 
        !           901:     wsprintf(pstr, "fmt=0x%x(\"", (WORD)fmt);
        !           902:     pstr += strlen(pstr);
        !           903:     if (cb = GetClipboardFormatName(fmt, pstr, 25)) {
        !           904:         pstr += cb;
        !           905:         *pstr++ = '\"';
        !           906:         *pstr++ = ')';
        !           907:     } else {
        !           908:         wsprintf(pstr, "%s\")", (LPSTR)pdf(fmt));
        !           909:         pstr += strlen(pstr);
        !           910:     }
        !           911:     return(pstr);
        !           912: }
        !           913: 
        !           914: 
        !           915: 
        !           916: PSTR DumpData(LPBYTE pData, UINT cb, CHAR *szBuf, UINT fmt)
        !           917: {
        !           918:     register INT i;
        !           919:     PSTR psz = szBuf;
        !           920: 
        !           921: 
        !           922:     while (cb) {
        !           923:         if (fmt == CF_TEXT) {
        !           924:             *szBuf++ = '\t';
        !           925:             *szBuf++ = '\"';
        !           926:             _fmemcpy(szBuf, pData, cb);
        !           927:             szBuf[cb - 2] = '\0';
        !           928:             _fstrcat(szBuf, "\"");
        !           929:             cb = 0;
        !           930:         } else {
        !           931:             memset(szBuf, ' ', 80);
        !           932:             szBuf[0] = '\t';
        !           933:             i = 0;
        !           934:             while (cb && (i < 16)) {
        !           935:                 wsprintf(&szBuf[i * 3 + 1], "%02x ", pData[0]);
        !           936:                 wsprintf(&szBuf[17 * 3 + i + 1], "%c", MPRT(pData[0]));
        !           937:                 pData++;
        !           938:                 cb--;
        !           939:                 i++;
        !           940:             }
        !           941:             szBuf[i * 3 + 1] = ' ';
        !           942:             szBuf[17 * 3 + i + 1] = ' ';
        !           943:             szBuf[68] = '\0';
        !           944:         }
        !           945:         szBuf += _fstrlen(szBuf);
        !           946:     }
        !           947:     return(szBuf);
        !           948: }
        !           949: 
        !           950: 
        !           951: 
        !           952: PSTR Error2String(UINT error)
        !           953: {
        !           954:     static CHAR szErr[23];
        !           955: 
        !           956:     if (error == 0) {
        !           957:         strcpy(szErr, RefString(IDS_ZERO));
        !           958:     } else if (error > DMLERR_LAST || error < DMLERR_FIRST) {
        !           959:         strcpy(szErr, RefString(IDS_HUH));
        !           960:     } else {
        !           961:         strcpy(szErr, apszResources[IDS_ERRST0 + error - DMLERR_FIRST]);
        !           962:     }
        !           963:     return(szErr);
        !           964: }
        !           965: 
        !           966: 
        !           967: 
        !           968: PSTR DdeMsg2String(UINT msg)
        !           969: {
        !           970:     static CHAR szBadMsg[10];
        !           971: 
        !           972:     if (msg < WM_DDE_FIRST || msg > WM_DDE_LAST) {
        !           973:         return((PSTR)itoa(msg, szBadMsg, 10));
        !           974:     } else {
        !           975:         return(apszResources[IDS_MSG0 + msg - WM_DDE_FIRST]);
        !           976:     }
        !           977: }
        !           978: 
        !           979: 
        !           980: 
        !           981: VOID OutputString(PSTR pstr)
        !           982: {
        !           983:     if (pro.fOutput[IO_FILE] & fhOutput) {
        !           984:         _lwrite(fhOutput, pstr, strlen(pstr));
        !           985:         _lwrite(fhOutput, RefString(IDS_CRLF), 2);
        !           986:         flushall();
        !           987:     }
        !           988:     if (pro.fOutput[IO_DEBUG]) {
        !           989:         OutputDebugString((LPSTR)pstr);
        !           990:         OutputDebugString(RefString(IDS_CRLF));
        !           991:     }
        !           992:     if (pro.fOutput[IO_SCREEN]) {
        !           993:         if (IsWindow(hWndString))
        !           994:             DrawString(hWndString, pstr);
        !           995:     }
        !           996: }
        !           997: 
        !           998: 
        !           999: 
        !          1000: BOOL SetFilters()
        !          1001: {
        !          1002:     UINT cbf;
        !          1003: 
        !          1004:     cbf = 0;
        !          1005:     if (pro.fTrack[IT_HSZS] || pro.fFilter[IF_HSZ])
        !          1006:         cbf |= MF_HSZ_INFO;
        !          1007:     if (pro.fTrack[IT_LINKS])
        !          1008:         cbf |= MF_LINKS;
        !          1009:     if (pro.fTrack[IT_CONVS])
        !          1010:         cbf |= MF_CONV;
        !          1011:     if (pro.fFilter[IF_SEND])
        !          1012:         cbf |= MF_SENDMSGS;
        !          1013:     if (pro.fFilter[IF_POST])
        !          1014:         cbf |= MF_POSTMSGS;
        !          1015:     if (pro.fFilter[IF_CB])
        !          1016:         cbf |= MF_CALLBACKS;
        !          1017:     if (pro.fFilter[IF_ERR])
        !          1018:         cbf |= MF_ERRORS;
        !          1019:     return((BOOL)DdeInitialize(&idInst, pfnDdeCallback, APPCLASS_MONITOR | cbf, 0));
        !          1020: }
        !          1021: 
        !          1022: 
        !          1023: 
        !          1024: 
        !          1025: 
        !          1026: /*
        !          1027:  * This dialog returns a file handle to the opened file name given or NULL
        !          1028:  * if cancel.
        !          1029:  */
        !          1030: 
        !          1031: BOOL CALLBACK OpenDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        !          1032: {
        !          1033:     HFILE  fh;
        !          1034:     lParam;
        !          1035: 
        !          1036:     switch (message) {
        !          1037:         case WM_INITDIALOG:
        !          1038:             SetDlgItemText(hDlg, IDC_EDIT, (LPSTR)OpenName);
        !          1039:             SendDlgItemMessage(hDlg, IDC_EDIT, EM_SETSEL,
        !          1040:                     GET_EM_SETSEL_MPS(0, 0x7fff));
        !          1041:             SetFocus(GetDlgItem(hDlg, IDC_EDIT));
        !          1042:             return (FALSE); /* Indicates the focus is set to a control */
        !          1043:             break;
        !          1044: 
        !          1045:         case WM_COMMAND:
        !          1046:             switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        !          1047:                 case IDOK:
        !          1048:                     GetDlgItemText(hDlg, IDC_EDIT, TBuf, MAX_FNAME);
        !          1049:                     GetFullPathName(TBuf, sizeof(OpenName), OpenName, (LPTSTR *)TBuf2);
        !          1050:                     fh = _lcreat(OpenName, 0);
        !          1051:                     if (fh == -1) {
        !          1052:                         MessageBox(hDlg, RefString(IDS_INVALID_FNAME),
        !          1053:                             NULL, MB_OK | MB_ICONHAND);
        !          1054:                         return (TRUE);
        !          1055:                     }
        !          1056: 
        !          1057:                     EndDialog(hDlg, (INT)fh);
        !          1058:                     return (TRUE);
        !          1059: 
        !          1060:                 case IDCANCEL:
        !          1061:                     EndDialog(hDlg, 0);
        !          1062:                     return (FALSE);
        !          1063:             }
        !          1064:             break;
        !          1065:     }
        !          1066:     return FALSE;
        !          1067: }
        !          1068: 
        !          1069: BOOL CALLBACK FilterDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        !          1070: {
        !          1071:     int i;
        !          1072:     lParam;
        !          1073: 
        !          1074:     switch (message) {
        !          1075:     case WM_INITDIALOG:
        !          1076:             for (i = IDRB_WM_DDE_INITIATE; i <= IDRB_WM_DDE_EXECUTE; i++) {
        !          1077:                 CheckDlgButton(hDlg, i, !fBlockMsg[i - IDRB_WM_DDE_INITIATE]);
        !          1078:             }
        !          1079:             for (i = IDRB_XTYP_ERROR; i <= IDRB_XTYP_WILDCONNECT; i++) {
        !          1080:                 CheckDlgButton(hDlg, i, !fBlockCb[i - IDRB_XTYP_ERROR]);
        !          1081:             }
        !          1082:             CheckDlgButton(hDlg, IDRB_TERSE, pro.fTerse);
        !          1083:             break;
        !          1084: 
        !          1085:         case WM_COMMAND:
        !          1086:             switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        !          1087:                 case IDOK:
        !          1088:                     for (i = IDRB_WM_DDE_INITIATE; i <= IDRB_WM_DDE_EXECUTE; i++) {
        !          1089:                         fBlockMsg[i - IDRB_WM_DDE_INITIATE] = !IsDlgButtonChecked(hDlg, i);
        !          1090:                     }
        !          1091:                     for (i = IDRB_XTYP_ERROR; i <= IDRB_XTYP_WILDCONNECT; i++) {
        !          1092:                         fBlockCb[i - IDRB_XTYP_ERROR] = !IsDlgButtonChecked(hDlg, i);
        !          1093:                     }
        !          1094:                     pro.fTerse = IsDlgButtonChecked(hDlg, IDRB_TERSE);
        !          1095:                     EndDialog(hDlg, TRUE);
        !          1096:                     break;
        !          1097: 
        !          1098:                 case IDCANCEL:
        !          1099:                     EndDialog(hDlg, 0);
        !          1100:                     break;
        !          1101:             }
        !          1102:             break;
        !          1103:     }
        !          1104:     return FALSE;
        !          1105: }
        !          1106: 
        !          1107: 
        !          1108: 
        !          1109: 
        !          1110: VOID GetProfile()
        !          1111: {
        !          1112:     pro.fOutput[IO_FILE]    = GetProfileBoolean(RefString(IDS_PROF_OUT_FILE),FALSE);
        !          1113:     pro.fOutput[IO_DEBUG]   = GetProfileBoolean(RefString(IDS_PROF_OUT_DEBUG),FALSE);
        !          1114:     pro.fOutput[IO_SCREEN]  = GetProfileBoolean(RefString(IDS_PROF_OUT_SCREEN),FALSE);
        !          1115: 
        !          1116:     pro.fFilter[IF_HSZ]     = GetProfileBoolean(RefString(IDS_PROF_MONITOR_STRINGHANDLES),FALSE);
        !          1117:     pro.fFilter[IF_SEND]    = GetProfileBoolean(RefString(IDS_PROF_MONITOR_INITIATES), FALSE);
        !          1118:     pro.fFilter[IF_POST]    = GetProfileBoolean(RefString(IDS_PROF_MONITOR_DDE_MESSAGES), FALSE);
        !          1119:     pro.fFilter[IF_CB]      = GetProfileBoolean(RefString(IDS_PROF_MONITOR_CALLBACKS), FALSE);
        !          1120:     pro.fFilter[IF_ERR]     = GetProfileBoolean(RefString(IDS_PROF_MONITOR_ERRORS),FALSE);
        !          1121: 
        !          1122:     pro.fTrack[IT_HSZS]     = GetProfileBoolean(RefString(IDS_PROF_TRACK_STRINGHANDLES), FALSE);
        !          1123:     pro.fTrack[IT_LINKS]    = GetProfileBoolean(RefString(IDS_PROF_TRACK_LINKS), FALSE);
        !          1124:     pro.fTrack[IT_CONVS]    = GetProfileBoolean(RefString(IDS_PROF_TRACK_CONVERSATIONS), FALSE);
        !          1125:     pro.fTrack[IT_SVRS]     = GetProfileBoolean(RefString(IDS_PROF_TRACK_SERVICES), FALSE);
        !          1126: 
        !          1127:     pro.fTerse              = GetProfileBoolean(RefString(IDS_PROF_TERSE), FALSE);
        !          1128: }
        !          1129: 
        !          1130: 
        !          1131: 
        !          1132: VOID SaveProfile()
        !          1133: {
        !          1134:     SetProfileBoolean(RefString(IDS_PROF_OUT_FILE), pro.fOutput[IO_FILE]  );
        !          1135:     SetProfileBoolean(RefString(IDS_PROF_OUT_DEBUG), pro.fOutput[IO_DEBUG] );
        !          1136:     SetProfileBoolean(RefString(IDS_PROF_OUT_SCREEN), pro.fOutput[IO_SCREEN]);
        !          1137: 
        !          1138:     SetProfileBoolean(RefString(IDS_PROF_MONITOR_STRINGHANDLES), pro.fFilter[IF_HSZ]   );
        !          1139:     SetProfileBoolean(RefString(IDS_PROF_MONITOR_INITIATES), pro.fFilter[IF_SEND]  );
        !          1140:     SetProfileBoolean(RefString(IDS_PROF_MONITOR_DDE_MESSAGES), pro.fFilter[IF_POST]  );
        !          1141:     SetProfileBoolean(RefString(IDS_PROF_MONITOR_CALLBACKS), pro.fFilter[IF_CB]    );
        !          1142:     SetProfileBoolean(RefString(IDS_PROF_MONITOR_ERRORS), pro.fFilter[IF_ERR]   );
        !          1143: 
        !          1144:     SetProfileBoolean(RefString(IDS_PROF_TRACK_STRINGHANDLES), pro.fTrack[IT_HSZS]   );
        !          1145:     SetProfileBoolean(RefString(IDS_PROF_TRACK_LINKS), pro.fTrack[IT_LINKS]  );
        !          1146:     SetProfileBoolean(RefString(IDS_PROF_TRACK_CONVERSATIONS), pro.fTrack[IT_CONVS]  );
        !          1147:     SetProfileBoolean(RefString(IDS_PROF_TRACK_SERVICES), pro.fTrack[IT_SVRS]   );
        !          1148: 
        !          1149:     SetProfileBoolean(RefString(IDS_PROF_TERSE), pro.fTerse   );
        !          1150: }
        !          1151: 
        !          1152: 
        !          1153: 
        !          1154: 
        !          1155: BOOL GetProfileBoolean(LPSTR pszKey, BOOL fDefault)
        !          1156: {
        !          1157:     GetPrivateProfileString(RefString(IDS_TITLE), pszKey, 
        !          1158:                     fDefault ? RefString(IDS_YES) : RefString(IDS_NO), TBuf,
        !          1159:                     sizeof(TBuf), RefString(IDS_INIFNAME));
        !          1160:     return(stricmp(RefString(IDS_NO), TBuf));
        !          1161: }
        !          1162: 
        !          1163: 
        !          1164: 
        !          1165: VOID SetProfileBoolean(LPSTR pszKey, BOOL fSet)
        !          1166: {
        !          1167:     WritePrivateProfileString(RefString(IDS_TITLE), pszKey, 
        !          1168:                     fSet ? RefString(IDS_YES) : RefString(IDS_NO), 
        !          1169:                     RefString(IDS_INIFNAME));
        !          1170: }
        !          1171: 
        !          1172: /*
        !          1173:  * Generic dialog invocation routine.  Handles procInstance stuff and param
        !          1174:  * passing.
        !          1175:  */
        !          1176: INT FAR DoDialog(
        !          1177:                 LPSTR lpTemplateName,
        !          1178:                 DLGPROC lpDlgProc,
        !          1179:                 UINT param,
        !          1180:                 BOOL fRememberFocus,
        !          1181:                 HWND hwndParent,
        !          1182:                 HANDLE hInst)
        !          1183: {
        !          1184:     UINT wRet;
        !          1185:     HWND hwndFocus;
        !          1186: 
        !          1187:     if (fRememberFocus)
        !          1188:         hwndFocus = GetFocus();
        !          1189:     lpDlgProc = (DLGPROC)MakeProcInstance(lpDlgProc, hInst);
        !          1190:     wRet = DialogBoxParam(hInst, (LPCSTR)lpTemplateName, hwndParent,
        !          1191:             lpDlgProc, param);
        !          1192:     FreeProcInstance((FARPROC)lpDlgProc);
        !          1193:     if (fRememberFocus)
        !          1194:         SetFocus(hwndFocus);
        !          1195:     return wRet;
        !          1196: }
        !          1197: 
        !          1198: 
        !          1199: BOOL CALLBACK MarkDlgProc(
        !          1200:                         HWND hwnd,
        !          1201:                         UINT msg,
        !          1202:                         WPARAM wParam,
        !          1203:                         LPARAM lParam)
        !          1204: {
        !          1205:     CHAR szT[MAX_MARK + 1];
        !          1206:     lParam;
        !          1207: 
        !          1208:     switch (msg){
        !          1209:     case WM_INITDIALOG:
        !          1210:         SetWindowText(hwnd, RefString(IDS_MARKDLGTITLE));
        !          1211:         SendDlgItemMessage(hwnd, IDEF_VALUE, EM_LIMITTEXT, MAX_MARK, 0);
        !          1212:         SetDlgItemText(hwnd, IDEF_VALUE, RefString(IDS_SEPERATOR));
        !          1213:         SetDlgItemText(hwnd, IDTX_VALUE, RefString(IDS_MARKTEXT));
        !          1214:         return(1);
        !          1215:         break;
        !          1216: 
        !          1217:     case WM_COMMAND:
        !          1218:         switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        !          1219:         case IDOK:
        !          1220:             GetDlgItemText(hwnd, IDEF_VALUE, szT, MAX_MARK);
        !          1221:             OutputString(szT);
        !          1222:             // fall through
        !          1223:         case IDCANCEL:
        !          1224:             EndDialog(hwnd, 0);
        !          1225:             break;
        !          1226: 
        !          1227:         default:
        !          1228:             return(FALSE);
        !          1229:         }
        !          1230:         break;
        !          1231:     }
        !          1232:     return(FALSE);
        !          1233: }
        !          1234: 
        !          1235: 

unix.superglobalmegacorp.com

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