Annotation of mstools/samples/sdktools/ddespy/ddespy.c, revision 1.1.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.