/* ********************************************************** accexcel.c - Access to Excell demo program Placed in public domain by Horizon Technologies Inc. 1990 ***revision history*** 1 ACCEXCEL.C 19-Jun-90,10:51:06,`JMH' Base version ***revision history*** ********************************************************** */ #define MAIN #define NOCOMM #include "windows.h" #include "dde.h" #include "ddelib.h" #include "string.h" #include "accexcel.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 char *gszAppName = "accexcel"; static char gszSheet[40] = "sheet1"; static char gszCell[40] = "r1c1"; static char gszData[80] = "7"; static int gcfFormat; static FARPROC glpfnAdviseCallBack; /* Functions */ int PASCAL WinMain (HANDLE, HANDLE, LPSTR, int); long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG); BOOL FAR PASCAL Initiate (HWND, unsigned, WORD, LONG); BOOL FAR PASCAL Poke (HWND, unsigned, WORD, LONG); BOOL FAR PASCAL Advise (HWND, unsigned, WORD, LONG); BOOL FAR PASCAL About (HWND, unsigned, WORD, LONG); WORD FAR PASCAL AdviseCallBack (HWND, unsigned, LPSTR, HANDLE); int PASCAL WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow) HANDLE hInstance; HANDLE hPrevInstance; LPSTR lpCmdLine; int nCmdShow; { WNDCLASS wndclass; MSG msg; HWND hWnd; ghInstance = hInstance; if (! hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; 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; } hWnd = CreateWindow (gszAppName, gszAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (! hWnd) return (NULL); ShowWindow (hWnd, nCmdShow); UpdateWindow (hWnd); gcfFormat = RegisterClipboardFormat ("csv"); glpfnAdviseCallBack = MakeProcInstance (AdviseCallBack, ghInstance); while (GetMessage (&msg, NULL, NULL, NULL)) { TranslateMessage (&msg); DispatchMessage (&msg); } FreeProcInstance (glpfnAdviseCallBack); return (msg.wParam); } long FAR PASCAL WndProc (hWnd, iMessage, wParam, lParam) HWND hWnd; unsigned iMessage; WORD wParam; LONG lParam; { static HWND hExcel = NULL; FARPROC lpfnFunc; DDEACK wAck; HANDLE hPoke; DDEPOKE FAR * lpPoke; DDEADVISE ddeAdvise; int iRet; switch (iMessage) { case WM_COMMAND: switch (wParam) { case IDM_EXIT: SendMessage (hWnd, WM_CLOSE, 0, 0L); break; case IDM_ABOUT: lpfnFunc = MakeProcInstance (About, ghInstance); DialogBox (ghInstance, "About", hWnd, lpfnFunc); FreeProcInstance (lpfnFunc); break; case IDM_INITIATE: if (hExcel) { DDETerminate (hExcel); hExcel = NULL; } lpfnFunc = MakeProcInstance (Initiate, ghInstance); iRet = DialogBox (ghInstance, "Initiate", hWnd, lpfnFunc); FreeProcInstance (lpfnFunc); if (iRet == IDOK) { hExcel = DDEInitiate (hWnd, "Excel", gszSheet); MessageBox (hWnd, hExcel? "Session Established" : "Initiate Failed", "Initiate", MB_OK); } break; case IDM_POKE: if (! hExcel) break; lpfnFunc = MakeProcInstance (Poke, ghInstance); iRet = DialogBox (ghInstance, "Poke", hWnd, lpfnFunc); FreeProcInstance (lpfnFunc); if (iRet == IDOK) { hPoke = GlobalAlloc (GHND | GMEM_DDESHARE, (DWORD) sizeof (DDEPOKE) + strlen (gszData)); /* Fill in the poke structure */ lpPoke = (DDEPOKE FAR *) GlobalLock (hPoke); lpPoke->fRelease = TRUE; lpPoke->cfFormat = gcfFormat; lstrcpy (lpPoke->Value, gszData); GlobalUnlock (hPoke); *(WORD *) &wAck = DDEPoke (hExcel, gszCell, hPoke); MessageBox (hWnd, wAck.fAck? "Poke successful" : "Poke failed", "Poke", MB_OK); } break; case IDM_ADVISE: if (! hExcel) break; lpfnFunc = MakeProcInstance (Advise, ghInstance); iRet = DialogBox (ghInstance, "Advise", hWnd, lpfnFunc); FreeProcInstance (lpfnFunc); if (iRet == IDOK) { /* Fill in the advise structure */ ddeAdvise.reserved = 0xABC; ddeAdvise.fDeferUpd = FALSE; ddeAdvise.fAckReq = TRUE; ddeAdvise.cfFormat = gcfFormat; *(WORD *) &wAck = DDEAdvise (hExcel, gszCell, &ddeAdvise, glpfnAdviseCallBack); MessageBox (hWnd, wAck.fAck? "Circuit established" : "Advise failed", "Advise", MB_OK); } break; case IDM_TERMINATE: if (hExcel) { DDETerminate (hExcel); hExcel = NULL; } break; } break; case WM_DESTROY: if (hExcel) { DDETerminate (hExcel); hExcel = NULL; } PostQuitMessage (0); break; default: return DefWindowProc (hWnd, iMessage, wParam, lParam); } return 0L; } /* Initiate box */ BOOL FAR PASCAL Initiate (hDlg, iMessage, wParam, lParam) HWND hDlg; unsigned iMessage; WORD wParam; LONG lParam; { switch(iMessage) { case WM_INITDIALOG: SetDlgItemText (hDlg, IDD_SHEET, gszSheet); break; case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText (hDlg, IDD_SHEET, gszSheet, sizeof (gszSheet)); EndDialog (hDlg, wParam); break; case IDCANCEL: EndDialog (hDlg, wParam); break; } break; default: return FALSE; } return TRUE; } /* Poke box */ BOOL FAR PASCAL Poke (hDlg, iMessage, wParam, lParam) HWND hDlg; unsigned iMessage; WORD wParam; LONG lParam; { switch(iMessage) { case WM_INITDIALOG: SetDlgItemText (hDlg, IDD_CELL, gszCell); SetDlgItemText (hDlg, IDD_DATA, gszData); break; case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText (hDlg, IDD_CELL, gszCell, sizeof (gszCell)); GetDlgItemText (hDlg, IDD_DATA, gszData, sizeof (gszData)); EndDialog (hDlg, wParam); break; case IDCANCEL: EndDialog (hDlg, wParam); break; } break; default: return FALSE; } return TRUE; } /* Advise box */ BOOL FAR PASCAL Advise (hDlg, iMessage, wParam, lParam) HWND hDlg; unsigned iMessage; WORD wParam; LONG lParam; { switch(iMessage) { case WM_INITDIALOG: SetDlgItemText (hDlg, IDD_CELL, gszCell); break; case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText (hDlg, IDD_CELL, gszCell, sizeof (gszCell)); EndDialog (hDlg, wParam); break; case IDCANCEL: EndDialog (hDlg, wParam); break; } break; default: return FALSE; } return TRUE; } /* 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; } return TRUE; } /* Callback routine for advise circuit */ WORD FAR PASCAL AdviseCallBack (hSession, iMessage, lpszItem, hData) HWND hSession; unsigned iMessage; LPSTR lpszItem; HANDLE hData; { DDEDATA FAR * lpData; /* If this is good data */ if (iMessage == DDE_DATA) { /* Move data to the current user string */ lpData = (DDEDATA FAR *) GlobalLock (hData); MessageBox (NULL, lpData->Value, lpszItem, MB_OK); GlobalUnlock (hData); } return NULL; }