Annotation of mstools/ole20/samples/spoly2/winmain.cpp, revision 1.1.1.1

1.1       root        1: /*** 
                      2: *spoly2.cpp
                      3: *
                      4: *  Copyright (C) 1992, Microsoft Corporation.  All Rights Reserved.
                      5: *  Information Contained Herein Is Proprietary and Confidential.
                      6: *
                      7: *Purpose:
                      8: *  This module is the main entry point for the sample IDispatch polygon
                      9: *  server, spoly2.exe.
                     10: *
                     11: *  This program is intended to demonstrate an implementation of the IDispatch
                     12: *  interface. Spoly is a very simple app, that implements two simple objects,
                     13: *  CPoly and CPoint and exposes their properties and methods for programatic
                     14: *  and cross-process access via IDispatch.
                     15: *
                     16: *Implementation Notes:
                     17: *
                     18: *****************************************************************************/
                     19: 
                     20: #include <stdio.h>
                     21: #include <string.h>
                     22: 
                     23: #include <windows.h>
                     24: #include <ole2.h>
                     25: #include <dispatch.h>
                     26: 
                     27: #include "common.h"
                     28: 
                     29: #include "statbar.h"
                     30: 
                     31: #include "spoly.h"
                     32: #include "cpoint.h"
                     33: #include "cpoly.h"
                     34: 
                     35: 
                     36: HANDLE g_hinst = 0;
                     37: 
                     38: HWND g_hwndFrame = 0;
                     39: HWND g_hwndClient = 0;
                     40: 
                     41: char g_szFrameWndClass[] = "FrameWClass";
                     42: 
                     43: DWORD g_dwPolyCF = 0L;
                     44: DWORD g_dwPointCF = 0L;
                     45: 
                     46: IClassFactory FAR* g_ppolyCF = NULL;
                     47: IClassFactory FAR* g_ppointCF = NULL;
                     48: 
                     49: BOOL g_fExitOnLastRelease = FALSE;
                     50: 
                     51: CStatBar FAR* g_psb = NULL;
                     52: 
                     53: 
                     54: HRESULT InitOle(void);
                     55: void UninitOle(void);
                     56: BOOL InitApplication(HANDLE);
                     57: BOOL InitInstance(HANDLE, int);
                     58: 
                     59: extern "C" int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);
                     60: extern "C" long FAR PASCAL FrameWndProc(HWND, UINT, WPARAM, LPARAM);
                     61: 
                     62: 
                     63: extern "C" int PASCAL
                     64: WinMain(
                     65:     HANDLE hinst,
                     66:     HANDLE hPrevInstance,
                     67:     LPSTR lpCmdLine,
                     68:     int nCmdShow)
                     69: {
                     70:     MSG msg;
                     71:     int retval;
                     72:     HRESULT hresult;
                     73: 
                     74:     if(!hPrevInstance)
                     75:       if(!InitApplication(hinst))
                     76:        return FALSE;
                     77: 
                     78:     if((hresult = InitOle()) != NOERROR)
                     79:       return FALSE;
                     80: 
                     81:     if(!InitInstance(hinst, nCmdShow)){
                     82:       retval = FALSE;
                     83:       goto LExit;
                     84:     }
                     85: 
                     86:     if(STRSTR(lpCmdLine, "-Embedding"))
                     87:       g_fExitOnLastRelease = TRUE;
                     88: 
                     89:     while(GetMessage(&msg, NULL, NULL, NULL)) {
                     90:       TranslateMessage(&msg);
                     91:       DispatchMessage(&msg);
                     92:     }
                     93: 
                     94:     CPoly::PolyTerm();
                     95: 
                     96:     retval = msg.wParam;
                     97: 
                     98: LExit:;
                     99:     UninitOle();
                    100: 
                    101:     return retval;
                    102: }
                    103: 
                    104: 
                    105: BOOL
                    106: InitApplication(HANDLE hinst)
                    107: {
                    108:     WNDCLASS  wc;
                    109: 
                    110:     wc.style           = CS_HREDRAW | CS_VREDRAW;
                    111:     wc.lpfnWndProc     = FrameWndProc;
                    112:     wc.cbClsExtra      = 0;
                    113:     wc.cbWndExtra      = 0;
                    114:     wc.hInstance       = hinst;
                    115:     wc.hIcon           = LoadIcon(hinst, "SPOLY");
                    116:     wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
                    117:     wc.hbrBackground   = (HBRUSH) (COLOR_APPWORKSPACE+1);
                    118:     wc.lpszMenuName    = "SPolyMenu";
                    119:     wc.lpszClassName   = g_szFrameWndClass;
                    120: 
                    121:     if(!RegisterClass(&wc))
                    122:       return FALSE;
                    123: 
                    124:     return TRUE;
                    125: }
                    126: 
                    127: 
                    128: BOOL
                    129: InitInstance(HANDLE hinst, int nCmdShow)
                    130: {
                    131:     g_hinst = hinst;
                    132: 
                    133:     // Create a main frame window
                    134:     //
                    135:     g_hwndFrame = CreateWindow(
                    136:       g_szFrameWndClass,
                    137:       "IDispatch Polygon Server #2",
                    138:       WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                    139:       CW_USEDEFAULT,
                    140:       CW_USEDEFAULT,
                    141:       CW_USEDEFAULT,
                    142:       CW_USEDEFAULT,
                    143:       NULL,
                    144:       NULL,
                    145:       hinst,
                    146:       NULL);
                    147:     if(!g_hwndFrame)
                    148:       return FALSE;
                    149: 
                    150:     g_hwndClient = GetWindow(g_hwndFrame, GW_CHILD);
                    151:     if(!g_hwndClient)
                    152:       return FALSE;
                    153: 
                    154:     // create the status bar
                    155:     //
                    156:     g_psb = CStatBar::Create(g_hinst, g_hwndFrame);
                    157:     if(!g_psb)
                    158:       return FALSE;
                    159: 
                    160:     // initialize and show the status bar
                    161:     //
                    162:     g_psb->SetHeight(GetSystemMetrics(SM_CYCAPTION) - 1);
                    163:     g_psb->SetFont(GetStockObject(SYSTEM_FONT));
                    164:     g_psb->SetText("");
                    165:     g_psb->Show();
                    166: 
                    167:     ShowWindow(g_hwndFrame, nCmdShow);
                    168: 
                    169:     UpdateWindow(g_hwndFrame);
                    170: 
                    171:     return TRUE;
                    172: }
                    173: 
                    174: 
                    175: /***
                    176: *HRESULT InitOle(void)
                    177: *Purpose:
                    178: *  Initialize Ole, and register our class factories.
                    179: *
                    180: *Entry:
                    181: *  None
                    182: *
                    183: *Exit:
                    184: *  None
                    185: *
                    186: ***********************************************************************/
                    187: HRESULT
                    188: InitOle()
                    189: {
                    190:     HRESULT hresult;
                    191: 
                    192:     if((hresult = OleInitialize(NULL)) != NOERROR)
                    193:       goto LError0;
                    194: 
                    195:     // Register the CPoint Class Factory
                    196:     //
                    197:     if((g_ppointCF = CPointCF::Create()) == NULL){
                    198:       hresult = ResultFromScode(E_OUTOFMEMORY);
                    199:       goto LError1;
                    200:     }
                    201: 
                    202:     hresult = CoRegisterClassObject(
                    203:       CLSID_CPoint2,
                    204:       g_ppointCF,
                    205:       CLSCTX_LOCAL_SERVER,
                    206:       REGCLS_MULTIPLEUSE,
                    207:       &g_dwPointCF);
                    208:     if(hresult != NOERROR)
                    209:       goto LError1;
                    210: 
                    211:     // Register the CPoly Class Factory.
                    212:     //
                    213:     if((g_ppolyCF = CPolyCF::Create()) == NULL){
                    214:       hresult = ResultFromScode(E_OUTOFMEMORY);
                    215:       goto LError1;
                    216:     }
                    217: 
                    218:     hresult = CoRegisterClassObject(
                    219:       CLSID_CPoly2,
                    220:       g_ppolyCF,
                    221:       CLSCTX_LOCAL_SERVER,
                    222:       REGCLS_MULTIPLEUSE,
                    223:       &g_dwPolyCF);
                    224:     if(hresult != NOERROR)
                    225:       goto LError1;
                    226: 
                    227:     g_ppolyCF->Release();
                    228: 
                    229:     g_ppointCF->Release();
                    230: 
                    231:     return NOERROR;
                    232: 
                    233: 
                    234: LError1:;
                    235:     if(g_ppolyCF != NULL)
                    236:       g_ppolyCF->Release();
                    237: 
                    238:     if(g_ppointCF != NULL)
                    239:       g_ppointCF->Release();
                    240: 
                    241:     UninitOle();
                    242: 
                    243: LError0:;
                    244:     return hresult;
                    245: }
                    246: 
                    247: 
                    248: void
                    249: UninitOle()
                    250: {
                    251:     // Tell Ole to release our class factories.
                    252:     //
                    253:     if(g_dwPointCF != 0L)
                    254:       CoRevokeClassObject(g_dwPointCF);
                    255: 
                    256:     if(g_dwPolyCF != 0L)
                    257:       CoRevokeClassObject(g_dwPolyCF);
                    258: 
                    259:     OleUninitialize();
                    260: }
                    261: 
                    262: 
                    263: void
                    264: FrameWndOnCreate(HWND hwnd)
                    265: {
                    266:     CLIENTCREATESTRUCT ccs;
                    267: 
                    268:     ccs.hWindowMenu = NULL;
                    269:     ccs.idFirstChild = IDM_FIRSTCHILD;
                    270: 
                    271:     g_hwndClient = CreateWindow(
                    272:       "MDICLIENT",
                    273:       0,
                    274:       WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
                    275:       0, 0, 0, 0,
                    276:       hwnd,
                    277:       (HMENU) 1,
                    278:       g_hinst,
                    279:       &ccs);
                    280: }
                    281: 
                    282: 
                    283: void
                    284: FrameWndOnSize(HWND hwnd)
                    285: {
                    286:     RECT rc;
                    287:     int height;
                    288: 
                    289:     // Get the client rectangle for the frame window
                    290:     GetClientRect(hwnd, &rc);
                    291: 
                    292:     height = g_psb->GetHeight();
                    293: 
                    294:     // adjust the client win to make room for the status bar.
                    295:     //
                    296:     MoveWindow(
                    297:       g_hwndClient,
                    298:       rc.left,
                    299:       rc.top,
                    300:       rc.right - rc.left,
                    301:       rc.bottom - rc.top - height,
                    302:       TRUE);
                    303: 
                    304:     // move the status bar to the bottom of the newly positioned window.
                    305:     //
                    306:     g_psb->SetX(rc.left);
                    307:     g_psb->SetY(rc.bottom - height),
                    308:     g_psb->SetWidth(rc.right - rc.left);
                    309:     g_psb->Move();
                    310: }
                    311: 
                    312: 
                    313: extern "C" long FAR PASCAL
                    314: FrameWndProc(
                    315:     HWND hwnd,
                    316:     UINT message,
                    317:     WPARAM wParam,
                    318:     LPARAM lParam)
                    319: {
                    320:     switch(message){
                    321:     case WM_COMMAND:
                    322:       switch(wParam){
                    323:       case IDM_DUMP:
                    324:        CPoly::PolyDump();
                    325:        return 0;
                    326: 
                    327:       case IDM_CLEAR:
                    328:        InvalidateRect(g_hwndClient, NULL, TRUE);
                    329:        return 0;
                    330:       }
                    331:       break;
                    332: 
                    333:     case WM_CREATE:
                    334:       FrameWndOnCreate(hwnd);
                    335:       break;
                    336: 
                    337:     case WM_SIZE:
                    338:       FrameWndOnSize(hwnd);
                    339:       return 1;
                    340: 
                    341:     case WM_PAINT:
                    342:       CPoly::PolyDraw();
                    343:       break;
                    344: 
                    345:     case WM_CLOSE:
                    346:       DestroyWindow(hwnd);
                    347:       return 0;
                    348: 
                    349:     case WM_DESTROY:
                    350:       PostQuitMessage(0);
                    351:       return 0;
                    352:     }
                    353:     return DefFrameProc(hwnd, g_hwndClient, message, wParam, lParam);
                    354: }

unix.superglobalmegacorp.com

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