Annotation of mstools/samples/rpc/whello/whelloc.c, revision 1.1

1.1     ! root        1: /****************************************************************************
        !             2: 
        !             3:     PROGRAM: whelloc.c
        !             4: 
        !             5:     PURPOSE: RPC sample Windows client
        !             6:             Based on Win 3.0 SDK Generic template for Windows applications
        !             7: 
        !             8:     FUNCTIONS:
        !             9: 
        !            10:        WinMain() - calls initialization function, processes message loop
        !            11:        InitApplication() - initializes window data and registers window
        !            12:        InitInstance() - saves instance handle and creates main window
        !            13:        MainWndProc() - processes messages
        !            14:        About() - processes messages for "About" dialog box
        !            15:        Server() - processes messages for "Server" dialog box
        !            16:        Endpoint() - processes messages for "Endpoint" dialog box
        !            17:        Send() - processes messages for "Send" dialog box; sends on OK
        !            18:        MIDL_user_allocate() - memory allocation function needed by RPC
        !            19:        MIDL_user_free() - memory free function needed by RPC
        !            20: 
        !            21:     COMMENTS:
        !            22: 
        !            23:         Windows can have several copies of your application running at the
        !            24:         same time.  The variable hInst keeps track of which instance this
        !            25:         application is so that processing will be to the correct window.
        !            26: 
        !            27: ****************************************************************************/
        !            28: 
        !            29: #include <windows.h>               /* required for all Win applications   */
        !            30: #include <stdio.h>
        !            31: #include <string.h>
        !            32: #include <rpc.h>                   /* required for all RPC applications   */
        !            33: #include <rpcndr.h>                /* required for all RPC applications   */
        !            34: #include "whello.h"                /* the RPC interface definitions       */
        !            35: #include "whelloc.h"               /* client-specific header file         */
        !            36: 
        !            37: HANDLE hInst;                      /* current instance                    */
        !            38: HCURSOR hHourGlass, hOld;          /* during calls to RPC API functions   */
        !            39: char pszFail[MSGLEN];              /* RPC API failure message             */
        !            40: 
        !            41: RPC_STATUS status;                 /* returned by RPC API function        */
        !            42: unsigned char * pszUuid            = "12345678-1234-1234-1234-123456789ABC";
        !            43: unsigned char * pszProtocolSequence = "ncacn_np";
        !            44: unsigned char  szNetworkAddress[UNCLEN+1];
        !            45: unsigned char  szEndpoint[PATHLEN+1];
        !            46: unsigned char * pszOptions         = NULL;
        !            47: unsigned char * pszStringBinding    = NULL;
        !            48: unsigned char  szString[MSGLEN];
        !            49: int  fBound;                       /* flag indicates whether bound to svr */
        !            50: 
        !            51: /****************************************************************************
        !            52: 
        !            53:     FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
        !            54: 
        !            55:     PURPOSE: calls initialization function, processes message loop
        !            56: 
        !            57:     COMMENTS:
        !            58: 
        !            59:         Windows recognizes this function by name as the initial entry point 
        !            60:         for the program.  This function calls the application initialization 
        !            61:         routine, if no other instance of the program is running, and always 
        !            62:         calls the instance initialization routine.  It then executes a message 
        !            63:         retrieval and dispatch loop that is the top-level control structure 
        !            64:         for the remainder of execution.  The loop is terminated when a WM_QUIT 
        !            65:         message is received, at which time this function exits the application 
        !            66:         instance by returning the value passed by PostQuitMessage(). 
        !            67: 
        !            68:         If this function must abort before entering the message loop, it 
        !            69:         returns the conventional value NULL.  
        !            70: 
        !            71: ****************************************************************************/
        !            72: int APIENTRY WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
        !            73: HANDLE hInstance;                           /* current instance             */
        !            74: HANDLE hPrevInstance;                       /* previous instance            */
        !            75: LPSTR lpCmdLine;                            /* command line                 */
        !            76: int nCmdShow;                               /* show-window type (open/icon) */
        !            77: {
        !            78:     MSG msg;                                /* message                      */
        !            79:     UNREFERENCED_PARAMETER(lpCmdLine);
        !            80: 
        !            81: 
        !            82:     if (!hPrevInstance)                         /* Other instances of app running? */
        !            83:        if (!InitApplication(hInstance)) /* Initialize shared things */
        !            84:            return (FALSE);              /* Exits if unable to initialize     */
        !            85: 
        !            86:     /* Perform initializations that apply to a specific instance */
        !            87: 
        !            88:     if (!InitInstance(hInstance, nCmdShow))
        !            89:         return (FALSE);
        !            90: 
        !            91:     /* Acquire and dispatch messages until a WM_QUIT message is received. */
        !            92: 
        !            93:     while (GetMessage(&msg,       /* message structure                      */
        !            94:            NULL,                  /* handle of window receiving the message */
        !            95:            NULL,                  /* lowest message to examine              */
        !            96:            NULL))                 /* highest message to examine             */
        !            97:        {
        !            98:        TranslateMessage(&msg);    /* Translates virtual key codes           */
        !            99:        DispatchMessage(&msg);     /* Dispatches message to window           */
        !           100:     }
        !           101: 
        !           102: 
        !           103:     return (msg.wParam);          /* Returns the value from PostQuitMessage */
        !           104: }
        !           105: 
        !           106: 
        !           107: /****************************************************************************
        !           108: 
        !           109:     FUNCTION: InitApplication(HANDLE)
        !           110: 
        !           111:     PURPOSE: Initializes window data and registers window class
        !           112: 
        !           113:     COMMENTS:
        !           114: 
        !           115:         This function is called at initialization time only if no other 
        !           116:         instances of the application are running.  This function performs 
        !           117:         initialization tasks that can be done once for any number of running 
        !           118:         instances.  
        !           119: 
        !           120:         In this case, we initialize a window class by filling out a data 
        !           121:         structure of type WNDCLASS and calling the Windows RegisterClass() 
        !           122:         function.  Since all instances of this application use the same window 
        !           123:         class, we only need to do this when the first instance is initialized.  
        !           124: 
        !           125: 
        !           126: ****************************************************************************/
        !           127: 
        !           128: BOOL InitApplication(hInstance)
        !           129: HANDLE hInstance;                             /* current instance           */
        !           130: {
        !           131:     WNDCLASS  wc;
        !           132: 
        !           133:     /* Fill in window class structure with parameters that describe the       */
        !           134:     /* main window.                                                           */
        !           135: 
        !           136:     wc.style = NULL;                    /* Class style(s).                    */
        !           137:     wc.lpfnWndProc = (WNDPROC)MainWndProc; /* Function to retrieve messages for  */
        !           138:                                         /* windows of this class.             */
        !           139:     wc.cbClsExtra = 0;                  /* No per-class extra data.           */
        !           140:     wc.cbWndExtra = 0;                  /* No per-window extra data.          */
        !           141:     wc.hInstance = hInstance;           /* Application that owns the class.   */
        !           142:     wc.hIcon = LoadIcon(hInstance, "HelloIcon");          /* loads icon */
        !           143:     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        !           144:     wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
        !           145:     wc.lpszMenuName =  "GenericMenu";   /* Name of menu resource in .RC file. */
        !           146:     wc.lpszClassName = "GenericWClass"; /* Name used in call to CreateWindow. */
        !           147: 
        !           148:     /* Register the window class and return success/failure code. */
        !           149: 
        !           150:     return (RegisterClass(&wc));
        !           151: 
        !           152: }
        !           153: 
        !           154: 
        !           155: /****************************************************************************
        !           156: 
        !           157:     FUNCTION:  InitInstance(HANDLE, int)
        !           158: 
        !           159:     PURPOSE:  Saves instance handle and creates main window
        !           160: 
        !           161:     COMMENTS:
        !           162: 
        !           163:         This function is called at initialization time for every instance of 
        !           164:         this application.  This function performs initialization tasks that 
        !           165:         cannot be shared by multiple instances.  
        !           166: 
        !           167:         In this case, we save the instance handle in a static variable and 
        !           168:         create and display the main program window.  
        !           169:         
        !           170: ****************************************************************************/
        !           171: 
        !           172: BOOL InitInstance(hInstance, nCmdShow)
        !           173:     HANDLE          hInstance;          /* Current instance identifier.       */
        !           174:     int             nCmdShow;           /* Param for first ShowWindow() call. */
        !           175: {
        !           176:     HWND           hWnd;               /* Main window handle.                */
        !           177: 
        !           178: 
        !           179:     /* Save the instance handle in static variable, which will be used in  */
        !           180:     /* many subsequence calls from this application to Windows.            */
        !           181: 
        !           182:     hInst = hInstance;
        !           183:     hHourGlass = LoadCursor(NULL, IDC_WAIT);
        !           184:     /* Create a main window for this application instance.  */
        !           185: 
        !           186:     hWnd = CreateWindow(
        !           187:         "GenericWClass",                /* See RegisterClass() call.          */
        !           188:        "RPC Sample Application",       /* Text for window title bar.         */
        !           189:         WS_OVERLAPPEDWINDOW,            /* Window style.                      */
        !           190:         CW_USEDEFAULT,                  /* Default horizontal position.       */
        !           191:         CW_USEDEFAULT,                  /* Default vertical position.         */
        !           192:         CW_USEDEFAULT,                  /* Default width.                     */
        !           193:         CW_USEDEFAULT,                  /* Default height.                    */
        !           194:         NULL,                           /* Overlapped windows have no parent. */
        !           195:        NULL,                           /* Use the window class menu.         */
        !           196:         hInstance,                      /* This instance owns this window.    */
        !           197:         NULL                            /* Pointer not needed.                */
        !           198:     );
        !           199: 
        !           200:     /* If window could not be created, return "failure" */
        !           201: 
        !           202:     if (!hWnd)
        !           203:        return (FALSE);
        !           204: 
        !           205:     /* initialize server name and endpoint variables */
        !           206:     strcpy(szString, "hello, world");
        !           207:     strcpy(szEndpoint, "\\pipe\\whello");
        !           208:     szNetworkAddress[0] = '\0';
        !           209:     fBound = FALSE;
        !           210:     Bind(hWnd);
        !           211: 
        !           212:     /* Make the window visible; update its client area; and return "success" */
        !           213:     ShowWindow(hWnd, nCmdShow);  /* Show the window                        */
        !           214:     UpdateWindow(hWnd);          /* Sends WM_PAINT message                 */
        !           215:     return (TRUE);               /* Returns the value from PostQuitMessage */
        !           216: 
        !           217: }
        !           218: 
        !           219: /****************************************************************************
        !           220: 
        !           221:     FUNCTION: MainWndProc(HWND, UINT, WPARAM, LPARAM)
        !           222: 
        !           223:     PURPOSE:  Processes messages
        !           224: 
        !           225:     MESSAGES:
        !           226: 
        !           227:        WM_COMMAND    - application menu (About dialog box)
        !           228:        WM_DESTROY    - destroy window
        !           229: 
        !           230:     COMMENTS:
        !           231: 
        !           232:        To process the IDM_ABOUT message, call MakeProcInstance() to get the
        !           233:        current instance address of the About() function.  Then call Dialog
        !           234:        box which will create the box according to the information in your
        !           235:        generic.rc file and turn control over to the About() function.  When
        !           236:        it returns, free the intance address.
        !           237: 
        !           238: ****************************************************************************/
        !           239: 
        !           240: long FAR PASCAL MainWndProc(hWnd, message, wParam, lParam)
        !           241: HWND hWnd;                               /* window handle                   */
        !           242: UINT message;                        /* type of message                 */
        !           243: WPARAM wParam;                             /* additional information          */
        !           244: LPARAM lParam;                             /* additional information          */
        !           245: {
        !           246:     FARPROC lpProc;              /* pointer to the dialog box function */
        !           247: 
        !           248:     switch (message) {
        !           249:        case WM_COMMAND:   /* message: command from application menu */
        !           250:            switch (wParam) {
        !           251:                case IDM_ABOUT:
        !           252:                    lpProc = MakeProcInstance((FARPROC)About, hInst);
        !           253:                    DialogBox(hInst,      /* current instance         */
        !           254:                        "AboutBox",       /* resource to use          */
        !           255:                        hWnd,             /* parent handle            */
        !           256:                        lpProc);          /* About() instance address */
        !           257:                    FreeProcInstance(lpProc);
        !           258:                    break;
        !           259: 
        !           260:                case IDM_SERVER:
        !           261:                    lpProc = MakeProcInstance((FARPROC)Server, hInst);
        !           262:                    DialogBox(hInst,      /* current instance         */
        !           263:                        "ServerBox",      /* resource to use          */
        !           264:                        hWnd,             /* parent handle            */
        !           265:                        lpProc);          /* Server  instance address */
        !           266:                    FreeProcInstance(lpProc);
        !           267:                    break;
        !           268: 
        !           269:                case IDM_ENDPOINT:
        !           270:                    lpProc = MakeProcInstance((FARPROC)Endpoint, hInst);
        !           271:                    DialogBox(hInst,      /* current instance         */
        !           272:                        "EndpointBox",    /* resource to use          */
        !           273:                        hWnd,             /* parent handle            */
        !           274:                        lpProc);          /* Server  instance address */
        !           275:                    FreeProcInstance(lpProc);
        !           276:                    break;
        !           277: 
        !           278:                case IDM_SEND:
        !           279:                    lpProc = MakeProcInstance((FARPROC)Send, hInst);
        !           280:                    DialogBox(hInst,      /* current instance         */
        !           281:                        "SendBox",        /* resource to use          */
        !           282:                        hWnd,             /* parent handle            */
        !           283:                        lpProc);          /* Server  instance address */
        !           284:                    FreeProcInstance(lpProc);
        !           285:                    break;
        !           286: 
        !           287:                case IDM_EXIT:
        !           288:                    if (fBound == TRUE)
        !           289:                        Shutdown();           /* shut down the server */
        !           290:                    DestroyWindow(hWnd);
        !           291:                    break;
        !           292: 
        !           293:                default:                  /* Lets Windows process it       */
        !           294:                    return (DefWindowProc(hWnd, message, wParam, lParam));
        !           295:            }
        !           296:            break;
        !           297: 
        !           298:        case WM_DESTROY:                  /* message: window being destroyed */
        !           299:            PostQuitMessage(0);
        !           300:            break;
        !           301: 
        !           302:        default:                          /* Passes it on if unprocessed    */
        !           303:            return (DefWindowProc(hWnd, message, wParam, lParam));
        !           304:     }
        !           305:     return (NULL);
        !           306: }
        !           307: 
        !           308: 
        !           309: /****************************************************************************
        !           310: 
        !           311:     FUNCTION: Server(HWND, unsigned, WORD, LONG)
        !           312: 
        !           313:     PURPOSE:  Processes messages for "Server" dialog box
        !           314: 
        !           315:     MESSAGES:
        !           316: 
        !           317:        WM_INITDIALOG - initialize dialog box
        !           318:        WM_COMMAND    - Input received
        !           319: 
        !           320:     COMMENTS:
        !           321: 
        !           322:        No initialization is needed for this particular dialog box, but TRUE
        !           323:        must be returned to Windows.
        !           324: 
        !           325:        Wait for user to click on "Ok" button, then close the dialog box.
        !           326: 
        !           327: ****************************************************************************/
        !           328: BOOL APIENTRY Server(
        !           329: HWND hDlg,                                /* window handle of the dialog box */
        !           330: UINT message,                         /* type of message                 */
        !           331: UINT wParam,                              /* message-specific information    */
        !           332: LONG lParam)
        !           333: {
        !           334: UNREFERENCED_PARAMETER(lParam);
        !           335: switch (message) {
        !           336: 
        !           337:     case WM_INITDIALOG:               /* message: initialize dialog box */
        !           338:        SetDlgItemText( hDlg, IDD_SERVERNAME, szNetworkAddress);
        !           339:        return (TRUE);
        !           340: 
        !           341:     case WM_COMMAND:                     /* message: received a command */
        !           342:        switch(wParam) {
        !           343:            case IDCANCEL:                /* System menu close command? */
        !           344:                EndDialog( hDlg, FALSE );
        !           345:                return( TRUE );
        !           346:            case IDOK:                    /* "OK" box selected?          */
        !           347:                GetDlgItemText( hDlg, IDD_SERVERNAME, szNetworkAddress, UNCLEN);
        !           348:                hOld = SetCursor(hHourGlass);
        !           349:                if (Bind(hDlg) != 0) {
        !           350:                    EndDialog(hDlg, FALSE);
        !           351:                    return(FALSE);
        !           352:                }
        !           353:                SetCursor(hOld);
        !           354:                EndDialog(hDlg, TRUE);
        !           355:                return(TRUE);
        !           356:         }  /* end switch wParam */
        !           357: 
        !           358:     } /* end switch message */
        !           359:     return (FALSE);             /* Didn't process a message    */
        !           360: }
        !           361: 
        !           362: /****************************************************************************
        !           363: 
        !           364:     FUNCTION: About(HWND, unsigned, WORD, LONG)
        !           365: 
        !           366:     PURPOSE:  Processes messages for "About" dialog box
        !           367: 
        !           368:     MESSAGES:
        !           369: 
        !           370:        WM_INITDIALOG - initialize dialog box
        !           371:        WM_COMMAND    - Input received
        !           372: 
        !           373:     COMMENTS:
        !           374: 
        !           375:        No initialization is needed for this particular dialog box, but TRUE
        !           376:        must be returned to Windows.
        !           377: 
        !           378:        Wait for user to click on "Ok" button, then close the dialog box.
        !           379: 
        !           380: ****************************************************************************/
        !           381: BOOL APIENTRY About(
        !           382: HWND hDlg,                                /* window handle of the dialog box */
        !           383: UINT message,                             /* type of message                 */
        !           384: UINT wParam,                              /* message-specific information    */
        !           385: LONG lParam)
        !           386: {
        !           387:     UNREFERENCED_PARAMETER(lParam);
        !           388: 
        !           389:     switch (message) {
        !           390:        case WM_INITDIALOG:                /* message: initialize dialog box */
        !           391:            return (TRUE);
        !           392: 
        !           393:        case WM_COMMAND:                      /* message: received a command */
        !           394:            if (wParam == IDOK                /* "OK" box selected?          */
        !           395:                 || wParam == IDCANCEL) {      /* System menu close command? */
        !           396: 
        !           397:                EndDialog(hDlg, TRUE);        /* Exits the dialog box        */
        !           398:                return (TRUE);
        !           399:            }
        !           400:            break;
        !           401:     }
        !           402:     return (FALSE);                          /* Didn't process a message    */
        !           403: }
        !           404: /****************************************************************************
        !           405: 
        !           406:     FUNCTION: Endpoint(HWND, unsigned, WORD, LONG)
        !           407: 
        !           408:     PURPOSE:  Processes messages for "Endpoint" dialog box
        !           409: 
        !           410:     MESSAGES:
        !           411: 
        !           412:        WM_INITDIALOG - initialize dialog box
        !           413:        WM_COMMAND    - Input received
        !           414: 
        !           415:     COMMENTS:
        !           416: 
        !           417:        No initialization is needed for this particular dialog box, but TRUE
        !           418:        must be returned to Windows.
        !           419: 
        !           420:        Wait for user to click on "Ok" button, then close the dialog box.
        !           421: 
        !           422: ****************************************************************************/
        !           423: BOOL APIENTRY Endpoint(
        !           424: HWND hDlg,                                /* window handle of the dialog box */
        !           425: UINT message,                             /* type of message                 */
        !           426: UINT wParam,                              /* message-specific information    */
        !           427: LONG lParam)
        !           428: {
        !           429:     UNREFERENCED_PARAMETER(lParam);
        !           430: 
        !           431: switch (message) {
        !           432: 
        !           433:     case WM_INITDIALOG:               /* message: initialize dialog box */
        !           434:        SetDlgItemText( hDlg, IDD_ENDPOINTNAME, szEndpoint);
        !           435:        return (TRUE);
        !           436: 
        !           437:     case WM_COMMAND:                     /* message: received a command */
        !           438:        switch(wParam) {
        !           439:            case IDCANCEL:                /* System menu close command? */
        !           440:                EndDialog( hDlg, FALSE );
        !           441:                return( TRUE );
        !           442:            case IDOK:                    /* "OK" box selected?          */
        !           443:                GetDlgItemText( hDlg, IDD_ENDPOINTNAME, szEndpoint, PATHLEN);
        !           444:                hOld = SetCursor(hHourGlass);
        !           445:                if (Bind(hDlg) != 0) {
        !           446:                    EndDialog(hDlg, FALSE);
        !           447:                    return(FALSE);
        !           448:                }
        !           449:                SetCursor(hOld);
        !           450:                EndDialog(hDlg, TRUE);
        !           451:                return(TRUE);
        !           452:         }  /* end switch wParam */
        !           453: 
        !           454:     } /* end switch message */
        !           455:     return (FALSE);             /* Didn't process a message    */
        !           456: }
        !           457: 
        !           458: /****************************************************************************
        !           459: 
        !           460:     FUNCTION: Send(HWND, unsigned, WORD, LONG)
        !           461: 
        !           462:     PURPOSE:  Processes messages for "Send" dialog box
        !           463: 
        !           464:     MESSAGES:
        !           465: 
        !           466:        WM_INITDIALOG - initialize dialog box
        !           467:        WM_COMMAND    - Input received
        !           468: 
        !           469:     COMMENTS:
        !           470: 
        !           471:        No initialization is needed for this particular dialog box, but TRUE
        !           472:        must be returned to Windows.
        !           473: 
        !           474:        Wait for user to click on "Ok" button, then close the dialog box.
        !           475: 
        !           476: ****************************************************************************/
        !           477: 
        !           478: BOOL APIENTRY Send(
        !           479: HWND hDlg,                                /* window handle of the dialog box */
        !           480: UINT message,                             /* type of message                 */
        !           481: UINT wParam,                              /* message-specific information    */
        !           482: LONG lParam)
        !           483: {
        !           484: UNREFERENCED_PARAMETER(lParam);
        !           485: switch (message) {
        !           486: 
        !           487:     case WM_INITDIALOG:               /* message: initialize dialog box */
        !           488:        SetDlgItemText( hDlg, IDD_MESSAGE, szString);
        !           489:        return (TRUE);
        !           490: 
        !           491:     case WM_COMMAND:                     /* message: received a command */
        !           492:        switch(wParam) {
        !           493:            case IDCANCEL:                /* System menu close command? */
        !           494:                EndDialog( hDlg, FALSE );
        !           495:                return( TRUE );
        !           496:            case IDOK:                    /* "OK" box selected?          */
        !           497:                GetDlgItemText( hDlg, IDD_MESSAGE, szString, MSGLEN);
        !           498:                RpcTryExcept {
        !           499:                    HelloProc(szString);  /* make call with user message */
        !           500:                }
        !           501:                RpcExcept(1) {
        !           502:                    MessageBox(hDlg,
        !           503:                            EXCEPT_MSG,
        !           504:                            "Remote Procedure Call",
        !           505:                             MB_ICONINFORMATION);
        !           506:                }
        !           507:                RpcEndExcept
        !           508:                EndDialog(hDlg, TRUE);
        !           509:                return(TRUE);
        !           510:         }  /* end switch wParam */
        !           511: 
        !           512:     } /* end switch message */
        !           513:     return (FALSE);             /* Didn't process a message    */
        !           514: }
        !           515: 
        !           516: /****************************************************************************
        !           517: 
        !           518:     FUNCTION: MIDL_user_allocate(size_t)
        !           519: 
        !           520:     PURPOSE:  Allocate memory as needed by the RPC runtime library
        !           521: 
        !           522:     COMMENTS:
        !           523: 
        !           524:        The stubs or runtime libraries may need to allocate memory.
        !           525:        By convention, they call a user-specified function named
        !           526:        MIDL_user_allocate.  In this application, no memory
        !           527:        management is needed, so a dummy function is provided.
        !           528: 
        !           529: ****************************************************************************/
        !           530: 
        !           531: void * MIDL_user_allocate(size_t len)
        !           532: {
        !           533:     UNREFERENCED_PARAMETER(len);
        !           534:     return(NULL);  // no memory management required
        !           535: }
        !           536: 
        !           537: /****************************************************************************
        !           538: 
        !           539:     FUNCTION: MIDL_user_free(void *)
        !           540: 
        !           541:     PURPOSE:  Free memory as needed by the RPC runtime library
        !           542: 
        !           543:     COMMENTS:
        !           544: 
        !           545:        The stubs or runtime libraries may need to free memory.
        !           546:        By convention, they call a user-specified function named
        !           547:        MIDL_user_free.  In this application, no memory allocation
        !           548:        is needed so a dummy function is provided.
        !           549: 
        !           550: ****************************************************************************/
        !           551: 
        !           552: void MIDL_user_free(void * ptr)
        !           553: {
        !           554:     UNREFERENCED_PARAMETER(ptr);
        !           555:     return;       // no memory management required
        !           556: }
        !           557: 
        !           558: /****************************************************************************
        !           559: 
        !           560:     FUNCTION: Bind(HWND)
        !           561: 
        !           562:     PURPOSE:  Make RPC API calls to bind to the server application
        !           563: 
        !           564:     COMMENTS:
        !           565: 
        !           566:        The binding calls are made from InitInstance() and whenever
        !           567:        the user changes the server name or endpoint. If the bind
        !           568:        operation is successful, the global flag fBound is set to TRUE.
        !           569: 
        !           570:        The global flag fBound is used to determine whether to call
        !           571:        the RPC API function RpcBindingFree.
        !           572: 
        !           573: ****************************************************************************/
        !           574: 
        !           575: 
        !           576: RPC_STATUS Bind(HWND hWnd)
        !           577: {
        !           578:     RPC_STATUS status;
        !           579: 
        !           580:     if (fBound == TRUE) {     /* unbind only if bound       */
        !           581:         status = RpcBindingFree(&hWHello);  // remote calls done; unbind
        !           582:         if (status) {
        !           583:              MessageBox(hWnd, "RpcBindingFree failed", "RPC Error",
        !           584:                         MB_ICONSTOP);
        !           585:              return(status);
        !           586:         }
        !           587:         else
        !           588:              fBound = FALSE;   /* unbind successful; reset flag */
        !           589:     }
        !           590:     status = RpcStringBindingCompose(pszUuid,
        !           591:                                      pszProtocolSequence,
        !           592:                                     szNetworkAddress,
        !           593:                                     szEndpoint,
        !           594:                                      pszOptions,
        !           595:                                     &pszStringBinding);
        !           596:     if (status) {
        !           597:         sprintf(pszFail, "RpcStringBindingCompose failed: (0x%x)\nNetwork Address = %s\n",
        !           598:                                         status, szNetworkAddress);
        !           599:         MessageBox(hWnd, pszFail,  "RPC Runtime Error",  MB_ICONEXCLAMATION);
        !           600:         return(status);
        !           601:     }
        !           602:     status = RpcBindingFromStringBinding(pszStringBinding,
        !           603:                                         &hWHello);
        !           604:     if (status) {
        !           605:         sprintf(pszFail, "RpcBindingFromStringBinding failed:(0x%x)\nString = %s\n",
        !           606:                         status, pszStringBinding);
        !           607:         MessageBox(hWnd, pszFail,  "RPC Runtime Error",  MB_ICONEXCLAMATION);
        !           608:         return(status);
        !           609:    }
        !           610:    fBound = TRUE;  /* bind successful; reset flag */
        !           611:    return(status);
        !           612: }
        !           613: 
        !           614: /**** end whelloc.c ****/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.