/* ********************************************************** sessutil.c - Session DDE client for variable maintenance Placed in public domain by Horizon Technologies Inc. 1990 ***revision history*** 1 SESSUTIL.C 29-Jan-90,13:35:12,`JMH' Base version 2 SESSUTIL.C 28-Feb-90,13:52:26,`JMH' Version as of 3/5/90 3 SESSUTIL.C 6-Mar-90,15:23:10,`JMH' Version as of 3/5/90 4 SESSUTIL.C 19-Jun-90,10:51:20,`JMH' Version as of 6/25/90 5 SESSUTIL.C 25-Jun-90,14:48:08,`JMH' Version as of 6/25/90 6 SESSUTIL.C 17-Sep-90,11:38:30,`JMH' Version 1.3 ***revision history*** ********************************************************** */ #define MAIN #define NOCOMM #include "windows.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "dde.h" #include "ddelib.h" #include "sessutil.h" /* Undocumented windows functions */ int FAR PASCAL lstrlen (LPSTR); LPSTR FAR PASCAL lstrcpy (LPSTR, LPSTR); LPSTR FAR PASCAL lstrcat (LPSTR, LPSTR); int FAR PASCAL lstrcmp (LPSTR, LPSTR); /* Globals */ static HANDLE ghInstance; static HWND ghWnd; static char *gszAppName = "SessUtil"; static DDECALLBACK glpfnUser; static FARPROC glpfnModify; static FARPROC glpfnAbout; static HANDLE ghSession; static char gszUser[100]; /* Functions */ int PASCAL WinMain (HANDLE, HANDLE, LPSTR, int); long FAR PASCAL SessutilProc (HWND, unsigned, WORD, LONG); WORD FAR PASCAL User (HWND, unsigned, LPSTR, HANDLE); BOOL FAR PASCAL Modify (HWND, unsigned, WORD, LONG); void Poke (void); BOOL FAR PASCAL About (HWND, unsigned, WORD, LONG); int PASCAL WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow) HANDLE hInstance; HANDLE hPrevInstance; LPSTR lpCmdLine; int nCmdShow; { WNDCLASS wndclass; MSG msg; ghInstance = hInstance; if ( !hPrevInstance ) { wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = SessutilProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon ( hInstance, gszAppName ); wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH ); wndclass.lpszMenuName = gszAppName; wndclass.lpszClassName = gszAppName; if ( !RegisterClass ( &wndclass ) ) return FALSE; } /* if ! hPrevInstance */ ghWnd = CreateWindow ( gszAppName, gszAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL ); if ( !ghWnd ) return ( NULL ); ShowWindow ( ghWnd, nCmdShow ); UpdateWindow ( ghWnd ); while ( GetMessage ( &msg, NULL, NULL, NULL ) ) { TranslateMessage ( &msg ); DispatchMessage ( &msg ); } /* while GetMessage */ return ( msg.wParam ); } /* function WinMain */ long FAR PASCAL SessutilProc (hWnd, iMessage, wParam, lParam) HWND hWnd; unsigned iMessage; WORD wParam; LONG lParam; { DDEADVISE ddeAdvise; PAINTSTRUCT ps; switch ( iMessage ) { case WM_CREATE: /* Provide callback addresses for DDE callback function */ glpfnUser = (DDECALLBACK) MakeProcInstance ( (FARPROC) User, ghInstance ); /* Inititate a DDE Session with SESSION */ if ( !( ghSession = DDEInitiate ( hWnd, "Session", "Variables" ) ) ) break; /* Ask to be advised everytime the User variable changes */ ddeAdvise.reserved = 0xABC; ddeAdvise.fDeferUpd = FALSE; ddeAdvise.fAckReq = TRUE; ddeAdvise.cfFormat = CF_TEXT; DDEAdvise ( ghSession, "User", &ddeAdvise, glpfnUser ); break; case WM_PAINT: BeginPaint ( hWnd, &ps ); TextOut ( ps.hdc, 0, 0, gszUser, strlen ( gszUser ) ); EndPaint ( hWnd, &ps ); break; case WM_COMMAND: switch ( wParam ) { case IDM_MODIFY: glpfnModify = MakeProcInstance ( Modify, ghInstance ); if ( DialogBox ( ghInstance, "Modify", hWnd, glpfnModify ) ) Poke (); FreeProcInstance ( glpfnModify ); break; case IDM_EXIT: SendMessage ( hWnd, WM_CLOSE, 0, 0L ); break; case IDM_ABOUT: glpfnAbout = MakeProcInstance ( About, ghInstance ); DialogBox ( ghInstance, "About", hWnd, glpfnAbout ); FreeProcInstance ( glpfnAbout ); break; } /* switch wParam */ break; case WM_DESTROY: /* Cancel the advise circuit for User */ DDEUnadvise ( ghSession, "User" ); /* End the session with SESSION */ DDETerminate ( ghSession ); PostQuitMessage ( 0 ); break; default: return DefWindowProc ( hWnd, iMessage, wParam, lParam ); } /* switch iMessage */ return 0L; } /* function SessutilProc */ /* Callback routine to notify when the User variable changes */ WORD FAR PASCAL User (hSession, iMessage, lpszItem, hData) HWND hSession; unsigned iMessage; LPSTR lpszItem; HANDLE hData; { LPDDEDATA lpData; switch ( iMessage ) { case DDE_ACK: break; case DDE_DATA: /* Move data to the current user string */ lpData = (LPDDEDATA) GlobalLock ( hData ); lstrcpy ( gszUser, lpData->Value ); GlobalUnlock ( hData ); /* Force a repaint */ InvalidateRect ( ghWnd, NULL, TRUE ); break; case DDE_TERMINATE: break; } return NULL; } /* function User */ /* Modify User variable dialog box */ BOOL FAR PASCAL Modify (hDlg, iMessage, wParam, lParam) HWND hDlg; unsigned iMessage; WORD wParam; LONG lParam; { switch ( iMessage ) { case WM_INITDIALOG: /* Initialize the value */ SetDlgItemText ( hDlg, IDD_USER, gszUser ); break; case WM_COMMAND: switch ( wParam ) { case IDOK: /* Get the new value */ GetDlgItemText ( hDlg, IDD_USER, gszUser, sizeof ( gszUser ) ) ; EndDialog ( hDlg, TRUE ); break; case IDCANCEL: EndDialog ( hDlg, FALSE ); break; } /* switch wParam */ break; default: return FALSE; } /* switch iMessage */ return TRUE; } /* function Modify */ /* Modify User variable dialog box */ void Poke () { HANDLE hPoke; LPDDEPOKE lpPoke; /* Create a poke structure */ hPoke = GlobalAlloc ( GHND | GMEM_DDESHARE, (DWORD) sizeof ( DDEPOKE ) + strlen ( gszUser ) ); /* Fill in the poke structure */ lpPoke = (LPDDEPOKE) GlobalLock ( hPoke ); lpPoke->fRelease = TRUE; lpPoke->cfFormat = CF_TEXT; lstrcpy ( lpPoke->Value, gszUser ); GlobalUnlock ( hPoke ); DDEPoke ( ghSession, "User", hPoke ); } /* function Poke */ /* About box */ BOOL FAR PASCAL About (hDlg, iMessage, wParam, lParam) HWND hDlg; unsigned iMessage; WORD wParam; LONG lParam; { switch ( iMessage ) { case WM_INITDIALOG: break; case WM_COMMAND: EndDialog ( hDlg, FALSE ); break; default: return FALSE; } /* switch iMessage */ return TRUE; } /* function About */