home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / ddemlwin.pak / DDESRVR.C < prev    next >
C/C++ Source or Header  |  1997-07-23  |  12KB  |  385 lines

  1. /* Borland C++ - (C) Copyright 1994 by Borland International               */
  2.  
  3. /***************************************************************************
  4.  
  5.       Program Name      DDESrvr.c
  6.  
  7.       Purpose           A simple DDE client application, which communicates
  8.                         to a DDE server using the new 3.1 api DDEML calls.
  9.  
  10.                         To use this program, build DDEClnt and DDESrvr. There
  11.                         are project files for this.
  12.  
  13. ****************************************************************************/
  14.  
  15. #define STRICT
  16.  
  17. #include <windows.h>
  18. #pragma hdrstop
  19. #include <ddeml.h>
  20. #include <dde.h>
  21. #include <windowsx.h>
  22.  
  23. #include <stdio.h>
  24. #include <string.h>
  25.  
  26. #include "ddesrvr.h"
  27.  
  28.  
  29. HANDLE         hInst;                  /*  Current instance of application */
  30. HWND           hWnd;                   /*  Handle of Main window           */
  31.  
  32. int            xScreen;                /* Screen metrics                   */
  33. int            yScreen;                /*  ...                             */
  34. int            yFullScreen;            /*  ...                             */
  35. int            xFrame;                 /*  ...                             */
  36. int            yMenu;                  /*  ...                             */
  37. TEXTMETRIC     tm;                     /* Text metrics                     */
  38. int            cxChar;                 /* Character metrics                */
  39. int            cyChar;                 /*  ...                             */
  40.  
  41. char           szScreenText[10][80];   /* Contains 10 lines of display data*/
  42. int            cCurrentLine;           /* Index into szScreenText          */
  43. int            cTotalLines;            /* Total lines in szScreenText      */
  44.  
  45. /*
  46.          The DDE variables
  47. */
  48.  
  49. DWORD          idInst = 0L;            /*  Instance of app for DDEML       */
  50. FARPROC        lpDdeProc;              /*  DDE callback function           */
  51. HSZ            hszService;
  52. HSZ            hszTopic;
  53. HSZ            hszItem;
  54. HCONV          hConvApp = (HCONV)NULL; /*Handle of established conversation*/
  55. char           szDDEData[80];          /*  Local receive buffer            */
  56. char           szDDEString[80];        /*  Local send buffer               */
  57. int            iServerCount = 0;       /*  Send message counter            */
  58. char           tbuf[5];                /*  Temporary buffer for count      */
  59.  
  60. char szAppName[] = "DDEServerApplication";
  61.  
  62.  
  63. /***************************************************************************/
  64.  
  65. #pragma argsused
  66. int PASCAL WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  67.                      LPSTR lpszCmdLine, int nCmdShow )
  68. {
  69.   MSG         msg;
  70.  
  71.  
  72.    if ( !hPrevInstance )               /* Other instances of app running?  */
  73.       if ( !InitApplication ( hInstance ) ) /* Initialize shared things    */
  74.          return ( FALSE );             /* Exits if unable to initialize    */
  75.  
  76.    if ( !InitInstance ( hInstance, nCmdShow ) )
  77.       return ( FALSE );
  78.  
  79.   while ( GetMessage ( &msg, NULL, 0, 0 ) )
  80.   {
  81.     TranslateMessage ( &msg );
  82.     DispatchMessage ( &msg );
  83.   }
  84.  
  85.    DdeUninitialize ( idInst );
  86.  
  87.   return ( msg.wParam );
  88. }
  89.  
  90. /***************************************************************************/
  91.  
  92. BOOL FAR PASCAL InitApplication ( HANDLE hInstance )
  93. {
  94.   WNDCLASS    wc;
  95.  
  96.    wc.style         = CS_HREDRAW | CS_VREDRAW;
  97.    wc.lpfnWndProc   = MainWndProc;
  98.    wc.cbClsExtra    = 0;
  99.    wc.cbWndExtra    = 0;
  100.    wc.hInstance     = hInstance;
  101.    wc.hIcon         = LoadIcon ( hInstance, "DDEServerIcon" );
  102.    wc.hCursor       = LoadCursor ( NULL, IDC_ARROW );
  103.    wc.hbrBackground = GetStockObject ( WHITE_BRUSH );
  104.    wc.lpszMenuName  = "DDEServerMenu";
  105.    wc.lpszClassName = szAppName;
  106.  
  107.    if ( !RegisterClass ( &wc ) )
  108.       return ( FALSE );
  109.  
  110.    return ( TRUE );
  111. }
  112.  
  113. /***************************************************************************/
  114.  
  115. BOOL InitInstance ( HANDLE hInstance, int nCmdShow )
  116. {
  117.    hInst = hInstance;
  118.  
  119.    xScreen     = GetSystemMetrics ( SM_CXSCREEN );
  120.    yScreen     = GetSystemMetrics ( SM_CYSCREEN );
  121.  
  122.   hWnd = CreateWindow ( szAppName,
  123.                          "DDE Server Window",
  124.                          WS_OVERLAPPEDWINDOW,
  125.                          190,                   /* These co-ordinates look */
  126.                          yScreen / 2 - 20,      /* good on a VGA monitor   */
  127.                          xScreen - 200,         /* running in 640x480.  No */
  128.                          yScreen / 2 - 50,      /* combination was tried.  */
  129.                          NULL,
  130.                          NULL,
  131.                          hInstance,
  132.                          NULL );
  133.  
  134. /*
  135.       If window could not be created, return "failure"
  136. */
  137.  
  138.    if ( !hWnd )
  139.       return ( FALSE );
  140.  
  141. /*
  142.       Make the window visible; update its client area; and return "success"
  143. */
  144.  
  145.    ShowWindow ( hWnd, nCmdShow );      /* Show the window                  */
  146.    UpdateWindow ( hWnd );              /* Sends WM_PAINT message           */
  147.    return ( TRUE );              /* Returns the value from PostQuitMessage */
  148.  
  149. }
  150.  
  151. /***************************************************************************/
  152.  
  153. #pragma warn -eff
  154. LRESULT CALLBACK _export MainWndProc ( HWND hWnd, UINT message,
  155.                                WPARAM wParam, LPARAM lParam )
  156. {
  157.    HDC            hDC;
  158.    PAINTSTRUCT    ps;
  159.    DLGPROC        dlgProcAbout;
  160.    int            i;
  161.    int            j;
  162.    int            y;
  163.  
  164.  
  165.    switch ( message )
  166.    {
  167.       case WM_CREATE:
  168.          hDC = GetDC ( hWnd );
  169.  
  170.          GetTextMetrics ( hDC, &tm );
  171.          cxChar = tm.tmAveCharWidth;
  172.          cyChar = tm.tmHeight + tm.tmExternalLeading;
  173.  
  174.          ReleaseDC ( hWnd, hDC );
  175.  
  176.          lpDdeProc = MakeProcInstance ( (FARPROC) DDECallback, hInst );
  177.          if ( DdeInitialize ( (LPDWORD)&idInst, (PFNCALLBACK)lpDdeProc,
  178.                               APPCLASS_STANDARD, 0L ) )
  179.          {
  180.             HandleOutput ( "DDE initialization failure." );
  181.             return ( FALSE );
  182.          }
  183.          else
  184.          {
  185.             hszService = DdeCreateStringHandle ( idInst, "Borland", CP_WINANSI );
  186.             hszTopic = DdeCreateStringHandle ( idInst, "DDEExample", CP_WINANSI );
  187.             hszItem = DdeCreateStringHandle ( idInst, "DDEData", CP_WINANSI );
  188.  
  189.             DdeNameService ( idInst, hszService, (HSZ) NULL, DNS_REGISTER );
  190.          }
  191.  
  192.          cCurrentLine = 0;
  193.          cTotalLines = 0;
  194.  
  195.          strcpy ( szDDEString, "Server application message number:  " );
  196.          break;
  197.  
  198.       case WM_COMMAND:
  199.    switch ( GET_WM_COMMAND_ID(wParam, lParam) )
  200.    {
  201.       case IDM_EXIT:
  202.          DestroyWindow ( hWnd );
  203.          break;
  204.  
  205.       case IDM_SHOW_CONNECTIONS:
  206.          if ( hConvApp != (HCONV)NULL )
  207.          {
  208.       HandleOutput ( "Connection established." );
  209.          }
  210.          else
  211.          {
  212.       HandleOutput ( "No connection established." );
  213.          }
  214.  
  215.          break;
  216.  
  217.       case IDM_ABOUT:
  218.          dlgProcAbout = (DLGPROC) MakeProcInstance ( (FARPROC)About, hInst );
  219.          DialogBox ( hInst, "AboutBox", hWnd, dlgProcAbout );
  220.          FreeProcInstance ( (FARPROC) dlgProcAbout );
  221.          break;
  222.  
  223.       default:
  224.          return ( DefWindowProc ( hWnd, message, wParam, lParam ) );
  225.    }
  226.    break;
  227.  
  228.       case WM_PAINT:
  229.    hDC = BeginPaint ( hWnd, &ps );
  230.  
  231.    y = 0;
  232.  
  233.    for ( i = 0; i < cTotalLines; i ++ )
  234.    {
  235.       if ( cTotalLines == 8 )
  236.          j = ( (cCurrentLine + 1 + i) % 9 );
  237.       else
  238.                j = i;
  239.  
  240.             TextOut ( hDC, 0, y, (LPSTR)(szScreenText[j]),
  241.                                  lstrlen ( szScreenText[j] ) );
  242.             y = y + cyChar;
  243.          }
  244.  
  245.          EndPaint ( hWnd, &ps );
  246.          break;
  247.  
  248.       case WM_DESTROY:
  249.          if ( hConvApp != (HCONV)NULL )
  250.    {
  251.             DdeDisconnect ( hConvApp );
  252.             hConvApp = (HCONV)NULL;
  253.          }
  254.  
  255.          DdeFreeStringHandle ( idInst, hszService );
  256.          DdeFreeStringHandle ( idInst, hszTopic );
  257.          DdeFreeStringHandle ( idInst, hszItem );
  258.  
  259.          FreeProcInstance ( lpDdeProc );
  260.  
  261.          PostQuitMessage ( 0 );
  262.          break;
  263.  
  264.       default:
  265.          return ( DefWindowProc ( hWnd, message, wParam, lParam ) );
  266.    }
  267.  
  268.    return ( FALSE );
  269. }
  270. #pragma warn .eff
  271.  
  272. /***************************************************************************/
  273.  
  274. #pragma argsused
  275. BOOL CALLBACK About ( HWND hDlg, UINT message,
  276.                         WPARAM wParam, LPARAM lParam )
  277. {
  278.    switch  ( message )
  279.    {
  280.       case WM_INITDIALOG:      /* message: initialize dialog box */
  281.    return ( TRUE );
  282.  
  283.       case WM_COMMAND:          /* message: received a command */
  284.    if ( GET_WM_COMMAND_ID(wParam, lParam) == IDOK ||
  285.         GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL )
  286.    {
  287.       EndDialog ( hDlg, TRUE );       /* Exits the dialog box        */
  288.       return ( TRUE );
  289.    }
  290.    break;
  291.    }
  292.    return ( FALSE );            /* Didn't process a message    */
  293. }
  294.  
  295. /***************************************************************************/
  296.  
  297. #pragma argsused
  298. HDDEDATA EXPENTRY _export DDECallback ( WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1,
  299.         HSZ hsz2, HDDEDATA hData, DWORD dwData1,
  300.         DWORD dwData2 )
  301. {
  302.    switch ( wType )
  303.    {
  304.       case XTYP_CONNECT:
  305.    if ( hsz2 == hszService )
  306.    {
  307.       return ( (HDDEDATA) TRUE );
  308.    }
  309.    else
  310.    {
  311.       HandleOutput ( "XTYP_CONNECT: hsz2 != hszService" );
  312.             return ( (HDDEDATA) FALSE );
  313.          }
  314.  
  315.       case XTYP_REQUEST:
  316.          iServerCount ++;
  317.          sprintf ( tbuf, "%3d.", iServerCount );
  318.          strncpy ( &szDDEString[36], tbuf, 5 );
  319.  
  320.        #if defined(__WIN32__)
  321.          hData = DdeCreateDataHandle ( idInst, (LPBYTE) szDDEString,
  322.        #else
  323.          hData = DdeCreateDataHandle ( idInst, (LPBYTE) szDDEString,
  324.        #endif
  325.                   sizeof ( szDDEString ), 0L, hszItem, wFmt, 0 );
  326.  
  327.          if ( hData != (HDDEDATA)NULL )
  328.    {
  329.             HandleOutput ( szDDEString );
  330.             return ( hData );
  331.          }
  332.          else
  333.          {
  334.             HandleOutput ( "Could not create data handle." );
  335.             return ( (HDDEDATA)NULL );
  336.          }
  337.  
  338.       case XTYP_EXECUTE:
  339.          break;
  340.  
  341.       case XTYP_POKE:
  342.          if ( hsz1 == hszTopic )
  343.          {
  344.             DdeGetData ( hData, (LPBYTE) szDDEData, 80L, 0L );
  345.  
  346.             if ( szDDEData != NULL )
  347.             {
  348.                HandleOutput ( szDDEData );
  349.                return ( (HDDEDATA) DDE_FACK );
  350.             }
  351.          }
  352.          else
  353.             return ( (HDDEDATA) NULL );
  354.    break;
  355.  
  356.       case XTYP_CONNECT_CONFIRM:
  357.          HandleOutput ( "DDE connection confirmed." );
  358.          hConvApp = hConv;
  359.          break;
  360.  
  361.       case XTYP_DISCONNECT:
  362.          hConvApp = (HCONV)NULL;
  363.          HandleOutput ( "The client has disconnected." );
  364.          break;
  365.  
  366.       case XTYP_ERROR:
  367.    break;
  368.    }
  369.  
  370.    return ( (HDDEDATA) NULL );
  371. }
  372.  
  373. /***************************************************************************/
  374.  
  375. void HandleOutput ( char *szOutputString )
  376. {
  377.    strcpy ( szScreenText[cCurrentLine], szOutputString );
  378.    cCurrentLine = ( cCurrentLine + 1 ) % 9;
  379.    if ( cTotalLines < 8 )
  380.       cTotalLines++;
  381.  
  382.    InvalidateRect ( hWnd, NULL, TRUE );
  383.    UpdateWindow ( hWnd );
  384. }
  385.