|
|
/****************************************************************************
PROGRAM: DdeSpy.c
****************************************************************************/
#define UNICODE
#include <windows.h> /* required for all Windows applications */
#include <windowsx.h>
#include <shellapi.h>
#include <dde.h>
#include <stdio.h>
#include <io.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "ddespy.h"
#include "lists.h"
/* GLOBAL Variables used for DDESPY */
UINT idInst = 0; HINSTANCE hInst; HICON hIcon; HWND hWndString = NULL; HWND hwndSpy = NULL; HANDLE fhOutput = NULL; OFSTRUCT ofsOpen; TCHAR OpenName[MAX_FNAME + 1]; TCHAR TBuf[BUFFER_SIZE]; TCHAR TBuf2[BUFFER_SIZE]; TCHAR szNULL[] = TEXT(""); LPTSTR apszResources[IDS_LAST + 1]; PFNCALLBACK pfnDdeCallback = NULL; HWND hwndTrack[IT_COUNT] = { 0 }; LPTSTR TrackTitle[IT_COUNT]; BOOL fBlockMsg[WM_DDE_LAST - WM_DDE_FIRST + 1] = { 0 }; BOOL fBlockCb[15] = { 0 }; LPTSTR TrackHeading[IT_COUNT]; struct { /* profile data */ BOOL fOutput[IO_COUNT]; BOOL fFilter[IF_COUNT]; BOOL fTrack[IT_COUNT]; BOOL fTerse; } pro;
BOOL LoadResourceStrings() { int i, cbLeft, cbRes; LPTSTR psz;
cbLeft = 0x1000; psz = LocalAlloc(LPTR, sizeof(TCHAR) * cbLeft); for (i = 0; i <= IDS_LAST; i++) { apszResources[i] = psz; cbRes = LoadString(hInst, i, psz, cbLeft) + 1; cbLeft -= cbRes; psz += cbRes; } for (i = 0; i < IT_COUNT; i++) { TrackTitle[i] = RefString(IDS_TRACKTITLE_1 + i); TrackHeading[i] = RefString(IDS_TRACKHEADING_1 + i); } lstrcpy(TBuf, RefString(IDS_DEFAULT_OUTPUT_FNAME)); GetFullPathName(TBuf, sizeof(OpenName) / sizeof(TCHAR), OpenName, (LPTSTR *)TBuf2); return(TRUE); }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg;
UNREFERENCED_PARAMETER(lpCmdLine);
hInst = hInstance;
if (!LoadResourceStrings()) { return (FALSE); }
if (!hPrevInstance) if (!InitApplication(hInstance)) /* Initialize shared things */ return (FALSE); /* Exits if unable to initialize */
/* Perform initializations that apply to a specific instance */
if (!InitInstance(hInstance, nCmdShow)) { CloseApp(); return (FALSE); }
/* Acquire and dispatch messages until a WM_QUIT message is received. */
while (GetMessage(&msg, /* message structure */ NULL, /* handle of window receiving the message */ 0, /* lowest message to examine */ 0)) /* highest message to examine */ { TranslateMessage(&msg); /* Translates virtual key codes */ DispatchMessage(&msg); /* Dispatches message to window */ } CloseApp(); return ((int)msg.wParam); /* Returns the value from PostQuitMessage */ }
BOOL InitApplication(HINSTANCE hInstance) { WNDCLASS wc;
if (!InitTestSubs()) return(FALSE);
/* Fill in window class structure with parameters that describe the */ /* main window. */
wc.style = 0; /* Class style(s). */ wc.lpfnWndProc = (WNDPROC)MainWndProc; /* Function to retrieve messages for */ /* windows of this class. */ wc.cbClsExtra = 0; /* No per-class extra data. */ wc.cbWndExtra = 0; /* No per-window extra data. */ wc.hInstance = hInstance; /* Application that owns the class. */ /* faster, also can localize "DDESpy" */ hIcon = wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DDESPY)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); /* Name of menu resource in .RC file. */ wc.lpszClassName = RefString(IDS_CLASS);
/* Register the window class and return success/failure code. */
return (RegisterClass(&wc)); }
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { RECT Rect; INT i;
/* Save the instance handle in static variable, which will be used in */ /* many subsequence calls from this application to Windows. */
pfnDdeCallback = (PFNCALLBACK)MakeProcInstance((FARPROC)DdeCallback, hInstance);
GetProfile();
/* Create a main window for this application instance. */
hwndSpy = CreateWindow( RefString(IDS_CLASS), RefString(IDS_TITLE), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, /* Default horizontal position. */ CW_USEDEFAULT, /* Default vertical position. */ CW_USEDEFAULT, /* Default width. */ CW_USEDEFAULT, /* Default height. */ NULL, /* Overlapped windows have no parent. */ NULL, /* Use the window class menu. */ hInstance, /* This instance owns this window. */ NULL /* Pointer not needed. */ );
GetClientRect(hwndSpy, (LPRECT) &Rect);
hWndString = CreateWindow( /* String Window (class Registered in Teststubs)*/ RefString(IDS_STRINGCLASS), szNULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL, 0, 0, Rect.right - Rect.left, Rect.bottom - Rect.top, hwndSpy, NULL, hInst, (LPTSTR)LongToPtr(MAKELONG(CCHARS, CLINES)));
for (i = 0; i < IT_COUNT; i++) { if (pro.fTrack[i]) { pro.fTrack[i] = FALSE; SendMessage(hwndSpy, WM_COMMAND, GET_WM_COMMAND_MPS(IDM_TRACK_FIRST + i, 0, 0)); } }
if (!hwndSpy || !hWndString) { CloseApp(); return (FALSE); }
/* Make the window visible; update its client area; and return "success" */
ShowWindow(hwndSpy, nCmdShow); /* Show the window */ UpdateWindow(hwndSpy); /* Sends WM_PAINT message */
if (SetFilters()) { return(FALSE); }
return(TRUE); }
VOID CloseApp() { DdeUninitialize(idInst); /* perform cleanup and store profile */ SaveProfile(); if (fhOutput != NULL) CloseHandle(fhOutput); UnregisterClass(RefString(IDS_CLASS), hInst); CloseTestSubs(hInst); }
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int i;
switch (message) { case WM_CREATE: LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCEL)); if (pro.fOutput[IO_FILE]) fhOutput = (HANDLE)DoDialog( MAKEINTRESOURCE(IDD_OPEN), (DLGPROC)OpenDlg, 0, TRUE, hWnd, hInst); pro.fOutput[IO_FILE] = (fhOutput != NULL); break;
case WM_INITMENU: if (GetMenu(hWnd) != (HMENU)wParam) break;
for (i = 0; i < IO_COUNT; i++) { CheckMenuItem((HMENU)wParam, IDM_OUTPUT_FIRST + i, pro.fOutput[i] ? MF_CHECKED : MF_UNCHECKED); }
for (i = 0; i < IF_COUNT; i++) { CheckMenuItem((HMENU)wParam, IDM_FILTER_FIRST + i, pro.fFilter[i] ? MF_CHECKED : MF_UNCHECKED); }
for (i = 0; i < IT_COUNT; i++) { CheckMenuItem((HMENU)wParam, IDM_TRACK_FIRST + i, pro.fTrack[i] ? MF_CHECKED : MF_UNCHECKED); } break;
case WM_COMMAND: /* message: command from application menu */ switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDM_OUTPUT_FILE: case IDM_OUTPUT_DEBUG: case IDM_OUTPUT_SCREEN: switch (wParam) { case IDM_OUTPUT_FILE: if (fhOutput != NULL) { wsprintf(TBuf, RefString(IDS_QCLOSEFILE_TEXT), OpenName); if (IDYES != MessageBox(hWnd, TBuf, RefString(IDS_QCLOSEFILE_CAPTION), MB_YESNO | MB_ICONQUESTION)) { break; } CloseHandle(fhOutput); } fhOutput = (HANDLE)DoDialog( MAKEINTRESOURCE(IDD_OPEN), (DLGPROC)OpenDlg, 0, TRUE, hWnd, hInst); pro.fOutput[IO_FILE] = (fhOutput != NULL); break;
case IDM_OUTPUT_DEBUG: pro.fOutput[IO_DEBUG] = !pro.fOutput[IO_DEBUG]; break;
case IDM_OUTPUT_SCREEN: pro.fOutput[IO_SCREEN] = !pro.fOutput[IO_SCREEN]; break;
} break;
case IDM_CLEARSCREEN: if (hWndString) { HANDLE hpsw; STRWND *psw;
hpsw = (HANDLE)GetWindowLongPtr(hWndString, 0); psw = (STRWND *)LocalLock(hpsw); ClearScreen(psw); LocalUnlock(hpsw); InvalidateRect(hWndString, NULL, TRUE); } break;
case IDM_MARK: DoDialog(MAKEINTRESOURCE(IDD_VALUEENTRY), (DLGPROC)MarkDlgProc, 0, TRUE, hWnd, hInst); break;
case IDM_FILTER_HSZINFO: case IDM_FILTER_INIT_TERM: case IDM_FILTER_DDEMSGS: case IDM_FILTER_CALLBACKS: case IDM_FILTER_ERRORS: pro.fFilter[wParam - IDM_FILTER_FIRST] = !pro.fFilter[wParam - IDM_FILTER_FIRST]; SetFilters(); break;
case IDM_FILTER_DIALOG: DoDialog(MAKEINTRESOURCE(IDD_MSGFILTERS), (DLGPROC)FilterDlgProc, 0, TRUE, hWnd, hInst); break;
case IDM_TRACK_HSZS: case IDM_TRACK_CONVS: case IDM_TRACK_LINKS: case IDM_TRACK_SVRS: pro.fTrack[wParam - IDM_TRACK_FIRST] = !pro.fTrack[wParam - IDM_TRACK_FIRST]; if (pro.fTrack[wParam - IDM_TRACK_FIRST]) { hwndTrack[wParam - IDM_TRACK_FIRST] = CreateMCLBFrame( NULL, TrackTitle[wParam - IDM_TRACK_FIRST], WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MINIMIZE, hIcon, (HBRUSH)(COLOR_APPWORKSPACE + 1), TrackHeading[wParam - IDM_TRACK_FIRST]); } else { DestroyWindow(hwndTrack[wParam - IDM_TRACK_FIRST]); hwndTrack[wParam - IDM_TRACK_FIRST] = 0; } SetFilters(); break;
case IDM_ABOUT: DoDialog(MAKEINTRESOURCE(IDD_ABOUTBOX), (DLGPROC)About, 0, TRUE, hWnd, hInst); break;
default: return (DefWindowProc(hWnd, message, wParam, lParam)); } break;
case WM_DESTROY: /* message: window being destroyed */ for (i = IDM_TRACK_FIRST; i <= IDM_TRACK_LAST; i++) { if (pro.fTrack[i - IDM_TRACK_FIRST]) { DestroyWindow(hwndTrack[i - IDM_TRACK_FIRST]); hwndTrack[i - IDM_TRACK_FIRST] = 0; } } PostQuitMessage(0); break;
case WM_SIZE: if (hWndString) { RECT rc;
GetClientRect(hWnd, &rc); MoveWindow(hWndString, 0, 0, rc.right, rc.bottom, TRUE); } // fall through
default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0); }
BOOL CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ return (TRUE);
case WM_COMMAND: /* message: received a command */ if (GET_WM_COMMAND_ID(wParam, lParam) == IDOK || GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL) { EndDialog(hDlg, TRUE); /* Exits the dialog box */ return (TRUE); } break; } return (FALSE); /* Didn't process a message */ }
HDDEDATA CALLBACK DdeCallback( UINT wType, UINT wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, UINT dwData1, UINT dwData2) { LPVOID pData; UINT cb; TCHAR *psz1, *psz2, *psz3; TCHAR *szAction; INT i; BOOL fInt = FALSE; wFmt; hConv; dwData1;
switch (wType) { case XTYP_MONITOR: if (pData = DdeAccessData(hData, (LPDWORD)&cb)) { switch (dwData2) { case MF_HSZ_INFO: if (pro.fTrack[IT_HSZS]) { switch (((MONHSZSTRUCT FAR *)pData)->fsAction) { case MH_DELETE: wsprintf(TBuf, fInt ? TEXT("0x%lx\t*\t%s(int)") : TEXT("0x%lx\t*\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); i = GetMCLBColValue(TBuf, hwndTrack[IT_HSZS], 2); if (i > 1) { wsprintf(TBuf2, fInt ? TEXT("0x%lx\t%d\t%s(int)") : TEXT("0x%lx\t%d\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, i - 1, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); AddMCLBText(TBuf, TBuf2, hwndTrack[IT_HSZS]); } else if (i == 1) { DeleteMCLBText(TBuf, hwndTrack[IT_HSZS]); } break;
case MH_KEEP: case MH_CREATE: wsprintf(TBuf, fInt ? TEXT("0x%lx\t*\t%s(int)") : TEXT("0x%lx\t*\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); i = GetMCLBColValue(TBuf, hwndTrack[IT_HSZS], 2) + 1; wsprintf(TBuf2, fInt ? TEXT("0x%lx\t%d\t%s(int)") : TEXT("0x%lx\t%d\t%s"), ((MONHSZSTRUCT FAR *)pData)->hsz, i, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); AddMCLBText(TBuf, TBuf2, hwndTrack[IT_HSZS]); } }
if (!pro.fFilter[IF_HSZ]) { DdeUnaccessData(hData); return(0); }
switch (((MONHSZSTRUCT FAR *)pData)->fsAction) { case MH_CLEANUP: szAction = RefString(IDS_ACTION_CLEANEDUP); break;
case MH_DELETE: szAction = RefString(IDS_ACTION_DESTROYED); break;
case MH_KEEP: szAction = RefString(IDS_ACTION_INCREMENTED); break;
case MH_CREATE: szAction = RefString(IDS_ACTION_CREATED); break;
default: DdeUnaccessData(hData); return(0); } if (pro.fTerse) { wsprintf(TBuf, TEXT("[%x:%ld] HSZ %s: %lx(%s)"), ((MONHSZSTRUCT FAR *)pData)->hTask, ((MONHSZSTRUCT FAR *)pData)->dwTime, (LPTSTR)szAction, ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); } else { wsprintf(TBuf, /* so we can localize message */ RefString(IDS_FMT_SH_MSG1), ((MONHSZSTRUCT FAR *)pData)->hTask, ((MONHSZSTRUCT FAR *)pData)->dwTime, (LPTSTR)szAction, ((MONHSZSTRUCT FAR *)pData)->hsz, (LPTSTR)((MONHSZSTRUCT FAR *)pData)->str); } break;
case MF_SENDMSGS: case MF_POSTMSGS: if (fBlockMsg[((MONMSGSTRUCT FAR *)pData)->wMsg - WM_DDE_FIRST]) { DdeUnaccessData(hData); return(0); } if (pro.fTerse) { wsprintf(TBuf, RefString(IDS_FMT_TRS_MSG1), ((MONMSGSTRUCT FAR *)pData)->hTask, ((MONMSGSTRUCT FAR *)pData)->dwTime, ((MONMSGSTRUCT FAR *)pData)->wParam, ((MONMSGSTRUCT FAR *)pData)->hwndTo, (dwData2 == MF_SENDMSGS) ? RefString(IDS_SENT) : RefString(IDS_POSTED), (LPTSTR)DdeMsg2String(((MONMSGSTRUCT FAR *)pData)->wMsg)); } else { wsprintf(TBuf, RefString(IDS_FMT_MSG1), ((MONMSGSTRUCT FAR *)pData)->hTask, ((MONMSGSTRUCT FAR *)pData)->dwTime, ((MONMSGSTRUCT FAR *)pData)->hwndTo, (dwData2 == MF_SENDMSGS) ? RefString(IDS_SENT) : RefString(IDS_POSTED), (LPTSTR)DdeMsg2String(((MONMSGSTRUCT FAR *)pData)->wMsg)); } OutputString(TBuf); wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_MSG2) : RefString(IDS_FMT_MSG2), ((MONMSGSTRUCT FAR *)pData)->wParam); DisectMsgLP(((MONMSGSTRUCT FAR *)pData)->wMsg, ((MONMSGSTRUCT FAR *)pData), &TBuf[lstrlen(TBuf)]); break;
case MF_CALLBACKS: if (fBlockCb[(((MONCBSTRUCT FAR *)pData)->wType & XTYP_MASK) >> XTYP_SHIFT]) { DdeUnaccessData(hData); return(0); } wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_CB1) : RefString(IDS_FMT_CB1), ((MONCBSTRUCT FAR *)pData)->hTask, ((MONCBSTRUCT FAR *)pData)->dwTime, (LPTSTR)Type2String(((MONCBSTRUCT FAR *)pData)->wType)); wsprintf(DumpFormat(((MONCBSTRUCT FAR *)pData)->wFmt, &TBuf[lstrlen(TBuf)]), pro.fTerse ? RefString(IDS_FMT_TRS_CB2) : RefString(IDS_FMT_CB2), (UINT_PTR)((MONCBSTRUCT FAR *)pData)->hConv, ((MONCBSTRUCT FAR *)pData)->hsz1, (LPTSTR)(psz1 = GetHszName(((MONCBSTRUCT FAR *)pData)->hsz1)), ((MONCBSTRUCT FAR *)pData)->hsz2, (LPTSTR)(psz2 = GetHszName(((MONCBSTRUCT FAR *)pData)->hsz2)), ((MONCBSTRUCT FAR *)pData)->hData, ((MONCBSTRUCT FAR *)pData)->dwData1, ((MONCBSTRUCT FAR *)pData)->dwData2, ((MONCBSTRUCT FAR *)pData)->dwRet); MyFree(psz1); MyFree(psz2); OutputString(TBuf); if (((MONCBSTRUCT FAR *)pData)->dwData1 && (((MONCBSTRUCT FAR *)pData)->wType == XTYP_CONNECT || ((MONCBSTRUCT FAR *)pData)->wType == XTYP_WILDCONNECT)) { // display proposed context
wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_CTXT1) : RefString(IDS_FMT_CTXT1), ((MONCBSTRUCT FAR *)pData)->cc.wFlags, ((MONCBSTRUCT FAR *)pData)->cc.wCountryID, ((MONCBSTRUCT FAR *)pData)->cc.iCodePage, ((MONCBSTRUCT FAR *)pData)->cc.dwLangID, ((MONCBSTRUCT FAR *)pData)->cc.dwSecurity, ((MONCBSTRUCT FAR *)pData)->cc.qos.ImpersonationLevel, ((MONCBSTRUCT FAR *)pData)->cc.qos.ContextTrackingMode, ((MONCBSTRUCT FAR *)pData)->cc.qos.EffectiveOnly); OutputString(TBuf); } if (((MONCBSTRUCT FAR *)pData)->hData && ((MONCBSTRUCT FAR *)pData)->cbData) { wsprintf(TBuf, RefString(IDS_INPUT_DATA)); OutputString(TBuf); DumpData((LPBYTE)((MONCBSTRUCT FAR *)pData)->Data, ((MONCBSTRUCT FAR *)pData)->cbData, TBuf, ((MONCBSTRUCT FAR *)pData)->wFmt); OutputString(TBuf); if (cb > MAX_DISPDATA) OutputString(RefString(IDS_TABDDD)); // DdeUnaccessData(((MONCBSTRUCT FAR *)pData)->hData);
} if ((((MONCBSTRUCT FAR *)pData)->wType & XCLASS_DATA) && ((MONCBSTRUCT FAR *)pData)->dwRet && ((MONCBSTRUCT FAR *)pData)->cbData) { wsprintf(TBuf, RefString(IDS_OUTPUT_DATA)); OutputString(TBuf); DumpData((LPBYTE)((MONCBSTRUCT FAR *)pData)->Data, ((MONCBSTRUCT FAR *)pData)->cbData, TBuf, ((MONCBSTRUCT FAR *)pData)->wFmt); OutputString(TBuf); if (cb > MAX_DISPDATA) OutputString(RefString(IDS_TABDDD)); // DdeUnaccessData(((MONCBSTRUCT FAR *)pData)->dwRet);
} DdeUnaccessData(hData); return(0); break;
case MF_ERRORS: wsprintf(TBuf, pro.fTerse ? RefString(IDS_FMT_TRS_ER1) : RefString(IDS_FMT_ER1), ((MONERRSTRUCT FAR *)pData)->hTask, ((MONERRSTRUCT FAR *)pData)->dwTime, ((MONERRSTRUCT FAR *)pData)->wLastError, (LPTSTR)Error2String(((MONERRSTRUCT FAR *)pData)->wLastError)); break;
case MF_LINKS: psz1 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszSvc); psz2 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszTopic); psz3 = GetHszName(((MONLINKSTRUCT FAR *)pData)->hszItem); if (!GetClipboardFormatName(((MONLINKSTRUCT FAR *)pData)->wFmt, TBuf2, BUFFER_SIZE)) lstrcpy(TBuf2, pdf(((MONLINKSTRUCT FAR *)pData)->wFmt)); if (!lstrcmp(RefString(IDS_HUH), TBuf2)) { wsprintf(TBuf2, TEXT("%d"), ((MONLINKSTRUCT FAR *)pData)->wFmt); }
wsprintf(TBuf, TEXT("%s\t%s\t%s\t%s\t%s\t%lx\t%lx"), (LPTSTR)psz1, (LPTSTR)psz2, (LPTSTR)psz3, (LPTSTR)TBuf2, ((MONLINKSTRUCT FAR *)pData)->fNoData ? RefString(IDS_WARM) : RefString(IDS_HOT), ((MONLINKSTRUCT FAR *)pData)->hConvClient, ((MONLINKSTRUCT FAR *)pData)->hConvServer);
if (((MONLINKSTRUCT FAR *)pData)->fEstablished) { AddMCLBText(TBuf, TBuf, hwndTrack[IT_LINKS]); } else { DeleteMCLBText(TBuf, hwndTrack[IT_LINKS]); }
MyFree(psz1); MyFree(psz2); MyFree(psz3); DdeUnaccessData(hData); return(0);
case MF_CONV: psz1 = GetHszName(((MONCONVSTRUCT FAR *)pData)->hszSvc); psz2 = GetHszName(((MONCONVSTRUCT FAR *)pData)->hszTopic);
wsprintf(TBuf, TEXT("%s\t%s\t%lx\t%lx"), (LPTSTR)psz1, (LPTSTR)psz2, ((MONCONVSTRUCT FAR *)pData)->hConvClient, ((MONCONVSTRUCT FAR *)pData)->hConvServer);
if (((MONCONVSTRUCT FAR *)pData)->fConnect) { AddMCLBText(TBuf, TBuf, hwndTrack[IT_CONVS]); } else { DeleteMCLBText(TBuf, hwndTrack[IT_CONVS]); }
MyFree(psz1); MyFree(psz2); DdeUnaccessData(hData); return(0);
default: lstrcpy(TBuf, RefString(IDS_UNKNOWN_CALLBACK)); } DdeUnaccessData(hData); OutputString(TBuf); } break;
case XTYP_REGISTER: case XTYP_UNREGISTER: if (!pro.fTrack[IT_SVRS]) { return(0); } psz1 = GetHszName(hsz1); psz2 = GetHszName(hsz2); wsprintf(TBuf, TEXT("%s\t%s"), (LPTSTR)psz1, (LPTSTR)psz2); if (wType == XTYP_REGISTER) { AddMCLBText(NULL, TBuf, hwndTrack[IT_SVRS]); } else { DeleteMCLBText(TBuf, hwndTrack[IT_SVRS]); } MyFree(psz1); MyFree(psz2); break; } return(0); }
LPTSTR DisectMsgLP(UINT msg, MONMSGSTRUCT *pmms, LPTSTR pszBuf) { static LONG m2t[] = {
/* LOW HIGH */
MAKELONG(T_APP | T_ATOM, T_TOPIC | T_ATOM), // WM_DDE_INITIATE
0, // WM_DDE_TERMINATE
MAKELONG(T_OPTIONHANDLE, T_ITEM | T_ATOM), // WM_DDE_ADVISE
MAKELONG(T_FORMAT, T_ITEM | T_ATOM), // WM_DDE_UNADVISE
MAKELONG(T_APP | T_ATOM | T_OR | T_STATUS, T_TOPIC | T_ITEM | T_ATOM | T_OR | T_STRINGHANDLE), // WM_DDE_ACK
MAKELONG(T_DATAHANDLE, T_ITEM | T_ATOM), // WM_DDE_DATA
MAKELONG(T_FORMAT, T_ITEM | T_ATOM), // WM_DDE_REQUEST
MAKELONG(T_DATAHANDLE, T_ITEM | T_ATOM), // WM_DDE_POKE
MAKELONG(0, T_STRINGHANDLE), // WM_DDE_EXECUTE
};
// ASSUMED: msg is a valid DDE message!!!
pszBuf = DisectWord(LOWORD(m2t[msg - WM_DDE_FIRST]), (UINT)pmms->dmhd.uiLo, &pmms->dmhd, pszBuf); *pszBuf++ = TEXT('\r'); *pszBuf++ = TEXT('\n'); *pszBuf++ = TEXT('\t'); return(DisectWord(HIWORD(m2t[msg - WM_DDE_FIRST]), (UINT)pmms->dmhd.uiHi, &pmms->dmhd, pszBuf)); }
/*
* Allocates local memory for and retrieves the string form of an HSZ. * Returns a pointer to the local memory or NULL if failure. * The string must be freed via MyFree(). */ LPTSTR GetHszName(HSZ hsz) { LPTSTR psz; UINT cb;
cb = (UINT)DdeQueryString(idInst, hsz, NULL, 0, 0) + 1; psz = LocalAlloc (LPTR, sizeof(TCHAR) * cb); DdeQueryString(idInst, hsz, psz, cb, 0); return(psz); }
LPTSTR DisectWord( UINT type, UINT data, DDEML_MSG_HOOK_DATA *pdmhd, LPTSTR pstr ) { UINT wT;
*pstr = TEXT('\0'); // in case we do nothing.
if (type & T_ATOM) { wT = GlobalGetAtomName((ATOM)data, (LPTSTR)pstr, 25); if (wT || data == 0) { if (type & T_APP) { lstrcpy(pstr, RefString(IDS_APPIS)); pstr += lstrlen(pstr); }
if (type & T_TOPIC) { lstrcpy(pstr, RefString(IDS_TOPICIS)); pstr += lstrlen(pstr); }
if (type & T_ITEM) { lstrcpy(pstr, RefString(IDS_ITEMIS)); pstr += lstrlen(pstr); } } if (wT) { wsprintf(pstr, TEXT("0x%x(\""), data); pstr += lstrlen(pstr); GlobalGetAtomName((ATOM)data, (LPTSTR)pstr, 25); pstr += wT; if (wT == 25) { *pstr++ = TEXT('.'); *pstr++ = TEXT('.'); *pstr++ = TEXT('.'); } *pstr++ = TEXT('\"'); *pstr++ = TEXT(')'); *pstr = TEXT('\0'); type &= ~(T_OR | T_STRINGHANDLE); // its an atom, so its not an object!
} else if (data == 0) { // could be a wild atom
*pstr++ = TEXT('*'); *pstr = TEXT('\0'); } else if (type & T_OR) { type &= ~T_OR; // not an atom, must be somthin else.
} else { /* so we can localize message */ wsprintf(pstr, RefString(IDS_BADATOM), data); pstr += lstrlen(pstr); } }
if (type & T_OR) { lstrcpy(pstr, RefString(IDS_OR)); pstr += lstrlen(pstr); }
if (type & T_OPTIONHANDLE) { if (pdmhd->cbData >= 4) { wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(pdmhd->Data[0])); pstr += lstrlen(pstr); if (LOWORD(pdmhd->Data[0]) & DDE_FACKREQ) { lstrcpy(pstr, RefString(IDS_FACKREQ)); pstr += lstrlen(pstr); } if (LOWORD(pdmhd->Data[0]) & DDE_FDEFERUPD) { lstrcpy(pstr, RefString(IDS_DEFERUPD)); pstr += lstrlen(pstr); } *pstr++ = TEXT(')'); *pstr++ = TEXT(' '); pstr = DumpFormat((UINT)HIWORD(pdmhd->Data[0]), pstr); } }
if (type & T_FORMAT) { pstr = DumpFormat(data, pstr); }
if (type & T_STATUS) { wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(data)); pstr += lstrlen(pstr); if (data & DDE_FACK) { lstrcpy(pstr, RefString(IDS_FACK)); pstr += lstrlen(pstr); } if (data & DDE_FBUSY) { lstrcpy(pstr, RefString(IDS_FBUSY)); pstr += lstrlen(pstr); } *pstr++ = TEXT(')'); *pstr = TEXT('\0'); }
if (type & T_STRINGHANDLE && pdmhd->cbData) { WCHAR szData[16];
memset(szData, '\0', 16 * sizeof(WCHAR)); memcpy(szData, pdmhd->Data, min(16 * sizeof(WCHAR), pdmhd->cbData)); szData[15] = L'\0'; wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_EXEC1) : RefString(IDS_FMT_EXEC1), (LPWSTR)szData); pstr += lstrlen(pstr); *pstr = TEXT('\0'); }
if (type & T_DATAHANDLE && pdmhd->cbData) { wsprintf(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_STATUSIS) : RefString(IDS_FMT_STATUSIS), LOWORD(pdmhd->Data[0])); pstr += lstrlen(pstr); if (LOWORD(pdmhd->Data[0]) & DDE_FRELEASE) { lstrcpy(pstr, RefString(IDS_FRELEASE)); pstr += lstrlen(pstr); } if (LOWORD(pdmhd->Data[0]) & DDE_FREQUESTED) { lstrcpy(pstr, RefString(IDS_FREQUESTED)); pstr += lstrlen(pstr); } *pstr++ = TEXT(')'); *pstr++ = TEXT(' '); pstr = DumpFormat(HIWORD(pdmhd->Data[0]), pstr); lstrcpy(pstr, pro.fTerse ? RefString(IDS_FMT_TRS_DATAIS1) : RefString(IDS_FMT_DATAIS1)); pstr += lstrlen(pstr); pstr = DumpData((LPBYTE)&pdmhd->Data[1], min(28, pdmhd->cbData - 4), pstr, HIWORD(pdmhd->Data[0])); } return(pstr); }
LPTSTR pdf(UINT fmt) { INT i; static struct { UINT fmt; LPTSTR psz; } fmts[] = { { CF_TEXT , TEXT("CF_TEXT") } , { CF_UNICODETEXT , TEXT("CF_UNICODETEXT") } , { CF_BITMAP , TEXT("CF_BITMAP") } , { CF_METAFILEPICT , TEXT("CF_METAFILEPICT") } , { CF_ENHMETAFILE , TEXT("CF_ENHMETAFILE") } , { CF_SYLK , TEXT("CF_SYLK") } , { CF_DIF , TEXT("CF_DIF") } , { CF_TIFF , TEXT("CF_TIFF") } , { CF_OEMTEXT , TEXT("CF_OEMTEXT") } , { CF_DIB , TEXT("CF_DIB") } , { CF_PALETTE , TEXT("CF_PALETTE") } , }; for (i = 0; i < 10; i++) if (fmts[i].fmt == fmt) return(fmts[i].psz); return(RefString(IDS_HUH)); }
LPTSTR DumpFormat(UINT fmt, LPTSTR pstr) { UINT cb;
wsprintf(pstr, TEXT("fmt=0x%x(\""), (WORD)fmt); pstr += lstrlen(pstr); if (cb = GetClipboardFormatName(fmt, pstr, 25)) { pstr += cb; *pstr++ = TEXT('\"'); *pstr++ = TEXT(')'); } else { wsprintf(pstr, TEXT("%s\")"), (LPTSTR)pdf(fmt)); pstr += lstrlen(pstr); } return(pstr); }
LPTSTR DumpData(LPBYTE pData, UINT cb, TCHAR *szBuf, UINT fmt) { register INT i; LPTSTR psz = szBuf;
while (cb) { if (fmt == CF_TEXT || fmt == CF_UNICODETEXT) { *szBuf++ = TEXT('\t'); if (fmt == CF_UNICODETEXT) { *szBuf++ = TEXT('U'); } *szBuf++ = TEXT('\"'); if (fmt == CF_UNICODETEXT) { memcpy(szBuf, pData, cb); } else { MultiByteToWideChar(CP_ACP, 0, pData, cb, szBuf, cb / sizeof(TCHAR)); } szBuf[cb - 2] = TEXT('\0'); lstrcat(szBuf, TEXT("\"")); cb = 0; } else { for (i = 0; i < 80 ; i++) { szBuf[i] = TEXT(' '); } szBuf[0] = TEXT('\t'); i = 0; while (cb && (i < 16)) { wsprintf(&szBuf[i * 3 + 1], TEXT("%02x "), pData[0]); wsprintf(&szBuf[17 * 3 + i + 1], TEXT("%c"), MPRT(pData[0])); pData++; cb--; i++; } szBuf[i * 3 + 1] = TEXT(' '); szBuf[17 * 3 + i + 1] = TEXT(' '); szBuf[68] = TEXT('\0'); } szBuf += lstrlen(szBuf); } return(szBuf); }
LPTSTR Error2String(UINT error) { static TCHAR szErr[23];
if (error == 0) { lstrcpy(szErr, RefString(IDS_ZERO)); } else if (error > DMLERR_LAST || error < DMLERR_FIRST) { lstrcpy(szErr, RefString(IDS_HUH)); } else { lstrcpy(szErr, apszResources[IDS_ERRST0 + error - DMLERR_FIRST]); } return(szErr); }
LPTSTR DdeMsg2String(UINT msg) { static TCHAR szBadMsg[10];
if (msg < WM_DDE_FIRST || msg > WM_DDE_LAST) { wsprintf (szBadMsg, TEXT("%ld"), szBadMsg); return (szBadMsg); // return((LPTSTR)itoa(msg, szBadMsg, 10));
} else { return(apszResources[IDS_MSG0 + msg - WM_DDE_FIRST]); } }
VOID OutputString(LPTSTR pstr) { DWORD cbWritten;
if (pro.fOutput[IO_FILE] && fhOutput != NULL) { static CHAR szT[200];
WideCharToMultiByte( CP_ACP, 0, pstr, -1, szT, 200, NULL, NULL); WriteFile(fhOutput, (LPCSTR) szT, lstrlenA(szT), &cbWritten, NULL); WriteFile(fhOutput, (LPCSTR) "\r\n", 2, &cbWritten, NULL); FlushFileBuffers(fhOutput); } if (pro.fOutput[IO_DEBUG]) { OutputDebugString((LPTSTR)pstr); OutputDebugString(RefString(IDS_CRLF)); } if (pro.fOutput[IO_SCREEN]) { if (IsWindow(hWndString)) DrawString(hWndString, pstr); } }
BOOL SetFilters() { UINT cbf;
cbf = 0; if (pro.fTrack[IT_HSZS] || pro.fFilter[IF_HSZ]) cbf |= MF_HSZ_INFO; if (pro.fTrack[IT_LINKS]) cbf |= MF_LINKS; if (pro.fTrack[IT_CONVS]) cbf |= MF_CONV; if (pro.fFilter[IF_SEND]) cbf |= MF_SENDMSGS; if (pro.fFilter[IF_POST]) cbf |= MF_POSTMSGS; if (pro.fFilter[IF_CB]) cbf |= MF_CALLBACKS; if (pro.fFilter[IF_ERR]) cbf |= MF_ERRORS; return((BOOL)DdeInitialize(&idInst, pfnDdeCallback, APPCLASS_MONITOR | cbf, 0)); }
/*
* This dialog returns a file handle to the opened file name given or NULL * if cancel. */
BOOL CALLBACK OpenDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE fh; lParam;
switch (message) { case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT, (LPTSTR)OpenName); SendDlgItemMessage(hDlg, IDC_EDIT, EM_SETSEL, GET_EM_SETSEL_MPS(0, 0x7fff)); SetFocus(GetDlgItem(hDlg, IDC_EDIT)); return (FALSE); /* Indicates the focus is set to a control */ break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: GetDlgItemText(hDlg, IDC_EDIT, TBuf, MAX_FNAME); GetFullPathName(TBuf, sizeof(OpenName), OpenName, (LPTSTR *)TBuf2); fh = CreateFile( OpenName, GENERIC_WRITE, FILE_SHARE_READ, (PSECURITY_ATTRIBUTES)NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fh == INVALID_HANDLE_VALUE) { MessageBox(hDlg, RefString(IDS_INVALID_FNAME), NULL, MB_OK | MB_ICONHAND); return (TRUE); }
EndDialog(hDlg, (INT_PTR)fh); return (TRUE);
case IDCANCEL: EndDialog(hDlg, 0); return (FALSE); } break; } return FALSE; }
BOOL CALLBACK FilterDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { int i; lParam;
switch (message) { case WM_INITDIALOG: for (i = IDRB_WM_DDE_INITIATE; i <= IDRB_WM_DDE_EXECUTE; i++) { CheckDlgButton(hDlg, i, !fBlockMsg[i - IDRB_WM_DDE_INITIATE]); } for (i = IDRB_XTYP_ERROR; i <= IDRB_XTYP_WILDCONNECT; i++) { CheckDlgButton(hDlg, i, !fBlockCb[i - IDRB_XTYP_ERROR]); } CheckDlgButton(hDlg, IDRB_TERSE, pro.fTerse); return TRUE; break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: for (i = IDRB_WM_DDE_INITIATE; i <= IDRB_WM_DDE_EXECUTE; i++) { fBlockMsg[i - IDRB_WM_DDE_INITIATE] = !IsDlgButtonChecked(hDlg, i); } for (i = IDRB_XTYP_ERROR; i <= IDRB_XTYP_WILDCONNECT; i++) { fBlockCb[i - IDRB_XTYP_ERROR] = !IsDlgButtonChecked(hDlg, i); } pro.fTerse = IsDlgButtonChecked(hDlg, IDRB_TERSE); EndDialog(hDlg, TRUE); break;
case IDCANCEL: EndDialog(hDlg, 0); break; } break; } return FALSE; }
VOID GetProfile() { pro.fOutput[IO_FILE] = GetProfileBoolean(RefString(IDS_PROF_OUT_FILE),FALSE); pro.fOutput[IO_DEBUG] = GetProfileBoolean(RefString(IDS_PROF_OUT_DEBUG),FALSE); pro.fOutput[IO_SCREEN] = GetProfileBoolean(RefString(IDS_PROF_OUT_SCREEN),FALSE);
pro.fFilter[IF_HSZ] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_STRINGHANDLES),FALSE); pro.fFilter[IF_SEND] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_INITIATES), FALSE); pro.fFilter[IF_POST] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_DDE_MESSAGES), FALSE); pro.fFilter[IF_CB] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_CALLBACKS), FALSE); pro.fFilter[IF_ERR] = GetProfileBoolean(RefString(IDS_PROF_MONITOR_ERRORS),FALSE);
pro.fTrack[IT_HSZS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_STRINGHANDLES), FALSE); pro.fTrack[IT_LINKS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_LINKS), FALSE); pro.fTrack[IT_CONVS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_CONVERSATIONS), FALSE); pro.fTrack[IT_SVRS] = GetProfileBoolean(RefString(IDS_PROF_TRACK_SERVICES), FALSE);
pro.fTerse = GetProfileBoolean(RefString(IDS_PROF_TERSE), FALSE); }
VOID SaveProfile() { SetProfileBoolean(RefString(IDS_PROF_OUT_FILE), pro.fOutput[IO_FILE] ); SetProfileBoolean(RefString(IDS_PROF_OUT_DEBUG), pro.fOutput[IO_DEBUG] ); SetProfileBoolean(RefString(IDS_PROF_OUT_SCREEN), pro.fOutput[IO_SCREEN]);
SetProfileBoolean(RefString(IDS_PROF_MONITOR_STRINGHANDLES), pro.fFilter[IF_HSZ] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_INITIATES), pro.fFilter[IF_SEND] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_DDE_MESSAGES), pro.fFilter[IF_POST] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_CALLBACKS), pro.fFilter[IF_CB] ); SetProfileBoolean(RefString(IDS_PROF_MONITOR_ERRORS), pro.fFilter[IF_ERR] );
SetProfileBoolean(RefString(IDS_PROF_TRACK_STRINGHANDLES), pro.fTrack[IT_HSZS] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_LINKS), pro.fTrack[IT_LINKS] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_CONVERSATIONS), pro.fTrack[IT_CONVS] ); SetProfileBoolean(RefString(IDS_PROF_TRACK_SERVICES), pro.fTrack[IT_SVRS] );
SetProfileBoolean(RefString(IDS_PROF_TERSE), pro.fTerse ); }
BOOL GetProfileBoolean(LPTSTR pszKey, BOOL fDefault) { GetPrivateProfileString(RefString(IDS_TITLE), pszKey, fDefault ? RefString(IDS_YES) : RefString(IDS_NO), TBuf, sizeof(TBuf), RefString(IDS_INIFNAME)); return(lstrcmpi(RefString(IDS_NO), TBuf)); }
VOID SetProfileBoolean(LPTSTR pszKey, BOOL fSet) { WritePrivateProfileString(RefString(IDS_TITLE), pszKey, fSet ? RefString(IDS_YES) : RefString(IDS_NO), RefString(IDS_INIFNAME)); }
/*
* Generic dialog invocation routine. Handles procInstance stuff and param * passing. */ INT_PTR FAR DoDialog( LPTSTR lpTemplateName, DLGPROC lpDlgProc, UINT param, BOOL fRememberFocus, HWND hwndParent, HANDLE hInst ) { UINT wRet; HWND hwndFocus;
if (fRememberFocus) hwndFocus = GetFocus(); lpDlgProc = (DLGPROC)MakeProcInstance(lpDlgProc, hInst); wRet = (UINT)DialogBoxParam(hInst, (LPCTSTR)lpTemplateName, hwndParent, lpDlgProc, param); FreeProcInstance((FARPROC)lpDlgProc); if (fRememberFocus) SetFocus(hwndFocus); return wRet; }
BOOL CALLBACK MarkDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TCHAR szT[MAX_MARK + 1]; lParam;
switch (msg){ case WM_INITDIALOG: SetWindowText(hwnd, RefString(IDS_MARKDLGTITLE)); SendDlgItemMessage(hwnd, IDEF_VALUE, EM_LIMITTEXT, MAX_MARK, 0); SetDlgItemText(hwnd, IDEF_VALUE, RefString(IDS_SEPERATOR)); SetDlgItemText(hwnd, IDTX_VALUE, RefString(IDS_MARKTEXT)); return(1); break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: GetDlgItemText(hwnd, IDEF_VALUE, szT, MAX_MARK); OutputString(szT); // fall through
case IDCANCEL: EndDialog(hwnd, 0); break;
default: return(FALSE); } break; } return(FALSE); }
#ifdef DBCS
/****************************************************************************
My_mbschr: strchr() DBCS version ****************************************************************************/ LPTSTR __cdecl My_mbschr( LPTSTR psz, TCHAR uiSep) { while (*psz != '\0' && *psz != uiSep) { psz = CharNext(psz); } if (*psz == '\0' && uiSep != '\0') { return NULL; } else { return psz; } } #endif
|