     OLE      

          MFC,   
   Windows-.       
  Windows   MFC.     
     . ,    
,   ,  OLE. OLE    
   Windows.  ,      
 .       .    
  OLE,    :   . 
 ,        , 
  ,   "OLE-".    
   OLE  . 
           
OLE-,      .    
     OLE     
   ,         
 OLE-. 

    523 

            ,   
    OLE. 

      OLE? 

    OLE   Object Linking and Embedding (  
 ).   ,  OLE   
 .  ,     
     ,   .  
     ,    OLE-. 
     ,      OLE  
  . OLE  1.0    1991 ,  
 .   OLE  2.0   
        .  
,   OLE-     . 
    ,  OLE 2       OLE I. OLE 1  
     ,   OLE 2 
     .    
        , OLE 2 
     . 
     OLE 2   OLE 1,     
    "OLE". 

    :         
OLE-.        
   .        
 OLE. 

         ? 

      OLE     ,  
,      .    
   :   .     
,  ,        
,         .   
  ,     .     
   . 
         ,    
      ,    
   .  ,   
,          
.     ,     
 ,      ,     
   ,    .     

    524                                    MFC:   

     ,       . 
,     ,    
   ,     .  , 
 ,   ,      . 
        ,    
   .     
 ,        ,  
      .    
  ,       
,      . 

       

     OLE     .   
 ,   OLE-    
 .  ,     OLE-,   
  ,     
  .   ,     OLE ( 
     OLE-),  ,   
OLE-    ,    
   . 
           :  
 .      ,  
 ,     ,    
. ,  ,    . 
-   .    
     ,   OLE. 

    OLE- 

     OLE-   ,   
   .    OLE   
,      : lUnknown.   
     ,    
   . 
            
,       ,    
OLE-         .  
         . 
     ,     
  .  ,     
      . 
      OLE    ,  : 
  -   ,     

    .  OLE                        525 

    ?     Query Interface (),   
 lUnknown.       ,  
    ,     
  . 
     MFC   OLE-   ,  
  ,   OLE,    
.   lUnknown      
-       . 

    OLE- 

       OLE  .    
         
,    .  OLE- 
'    ,     
 ,   . OLE-    
   Windows. 

      OLE  Windows? 

      OLE       
   ,        
.   OLE       
.  , OLE-      
    .   ,  OLE 
 , -    
 Windows.    OLE    
   ,      ,   
 OLE      Windows. 

      

      Windows-      
 .  ,     ,  
       .  ,  
      OLE   . 
    OLE,       ,  
  .         OLE, 
   OLE  ,     
   .  ,       
 OLE         
OLE- . 
     ,    Windows   . -,  
       . ,  
     ,    

    526                                    MFC:   

        ,         
 . -,      
 .        
   .      
      ,     . 
          ,     
,   .       
,      .  ,    
   ,        . 
           OLE,     OLE 
    .      
 ,    OLE-  
     . 

          MFC 

     MFC        ,  
   OLE-  -.    
  ,   OLE.     
  ,      :  
       .  MFC    
 . 
      ,         
 .       
 .       . 

     OLE- 

            OLE,  
 : COIeDataSource  COleDataObject.    , 
  .  ,    COIeDataSource 
  ,       .  
  ,  .  ,   
COIeDataSource       COleDataObject.  
       .  , 
    COleDataObject. 
      OLE-       AFXOLE.H. 

     AfxOleInitO 

        OLE   .  
       AfxOleInitO.   
     CWinApp::InitInstance().   
AfxOleInitO : 

    BOOL AFXAPI AfxOleInitO; 

               
  . 

    .  OLE                        527 


         

             : 
    1.   . 
    2. ,       . 
    3.    ,   . 
    4.    . 
       ,      : 
    
    //      
    afx msg void CMainWin::OnClipRead() 
    ( 
    COleDataObject OleOb; 
    char str[MAXSIZE] ; 
    char *p; 
    HGLOBAL hGin; 
    int i; 
    OleOb.AttachClipboard () ; 
    if(OleOb.IsDataAvailable(CF_TEXT)) 
    hGin = OleOb.GetGlobalData(CF_TEXT); 
    else return; 
    if(ihGin) ( 
    MessageBox("Cannot obtain handle to data.", "Error"); 
    return; 
    } 
    p = (char *) GlobalLock(hGin); 
    for (i=0; KMAXSIZE && *p; i++) str[i] = *p++; 
    str[i] = '\0' ; 
    GlobalUnlock(hGin) ; 
    MessageBox(str, "Read from Clipboard"); 
    GlobalFree (hGin) ; 
    ) 

          ,      
  COleDataObject    AttachClipboard(),  
 : 

    BOOL COleDataObject::AttachClipboard() ; 

               
 .        
        
.      ,   
 COleDataObject,     , . 

    528                                    MFC:   

       OnClipReadQ ,     
   .     
IsDataAvailable(),    : 

    BOOL COleDataObject::IsDataAvailable(CLIPFORMAT DataFormat, 
    LPFORMATETC -IpFormafc=NULL) ; 

      DataFannat    .  
IpFomat         
.    NULL,      
DataFormat.    ,    
   ,      . 
      DataFormat ,   ,    
 ,    OLE-.   
    .      
    (. B.I): 

     . 1.    

                    

    CF_BITMAP              
    CF_DIB                     
 BITMAPINFO 
    CF_OEMTEXT            OEM 
    CF_PALETTE            
    CF_TEXT              
    CF_WAVE              WAVE- 
    CF_UNICODETEXT       UNICODE_________________ 

      CF_TEXT, CF_OEMTEXT  CFJJNICODETEXT   
 '\0',      " / 
".      CF_TEXT. 
          ,     
GetGlobalData()     ,  
  .     : 

    HGLOBAL COleDataObject::GetGlobalData(CLIPFORMAT DataFormat, 
    LPFORMATETC IpFormat^NULL) ; 

      DataFonnat     (  
 ).  IpFormat     
    .    NULL,   
   DataFormat.    , 
          . 
     GetGlobalDataQ   ,   
 .     ,  NULL.  
 ,   GetGlobalData(),  
   GlobalLockQ.   : 

    LPVOID *GlobalLock(HGLOBAL hObj) ; 


    .  OLE                        529 

       ,   , 
   hObj.       
 .     GetGlobalDataQ   
 ,     NULL. ,    
 ,      .  
         . 
            , 
   .       , 
      Windows.  :  
  Windows,        . 
      ,       
 API- GlobalUnlockO,    : 

    BOOL GlobalUnlock(HGLOBAL hObj); 

               
  .       hObj. 
         ,   
GetGlobalData(), ,        
API- GlobalFreeQ.    : 

    HGLOBAL GlobalFree(HGLOBAL hGmem); 

          .  
,          
 ,       .  
        . 
,   ,      
,  API- ReleaseStgMedium().  ,  
    ,    . 

          

            
   .       
. (,  ,    ,  
      .)      
. B.I.     ,    
 Read   Clipboard.       
(,        ),    
     .     
   ,       . 
        : 

    ; CLIP.RC 
    ^include <afxres.h> 
    ^include "ids.h" 
    ClipboardMenu MENU 


    530                                    MFC:   


    ; 
    POPUP "SDemo" 
    { 
    
    MENUITEM "SRead From Clipboard\tF2", IDM_READ 
    MENUITEM "E&xit\tF3", IDM^EXIT 
    ) 
    MENUITEM "SHelp", IDM_HELP 
    t 
    
    ClipboardMenu ACCELERATORS 
    ( 
    VK_F1, IDM_HELP, VIRTKEY 
    VK_F2, IDM_READ, VIRTKEY 
    VK_F3, IDM_EXIT, VIRTKEY 
    ) 
        IDS.H: 
    // IDS.H 
    #define IDM_READ    100 
    #define IDM_EXIT    101 
    #define IDM_HELP    102 
    ^define MAXSIZE     255 
       CLIP.H,    : 
    // CLIP.H 
    
    //       
    class CMainWin : public CFrameWnd 
    f 
    public: 
    CMainWin() ; 
    afx msg void OnClipRead () ; 
    afx msg void OnExitQ; 
    afx msg void OnHelpO; 
    DECLARE_MESSAGE__MAP() 
    //      
    class CApp : public CWinApp 
    ( 
    public: 
    BOOL Initlnstance () ; 
    }; 

        : 

    //        OLE. 
    #include <afxwin.h> 


    .  OLE                        531 


    ^include <afxole.h> 
    ^include "clip.h" 
    ^include "ids.h" 
    //    
    CMainWin::CMainWin () 
    ( 
    Create(NULL, "OLE-Based Clipboard Demo", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "ClipboardMenu"); 
    //     
    if('LoadAccelTable("ClipboardMenu")) 
    MessageBox ("Cannot Load Accelerators", "Error"); 
    } 
    
    //   
    BOOL CApp::Initlnstance () 
    { 
    m pMainWnd = new CMainWin; 
    m pMainWnd->ShowWindow(m_nCmdShow) ; 
    m pMainWnd->UpdateWindow(); 
    if(!Afx01eInit ()) 
    AfxMessageBox("OLE Initialization Error"); 
    return TRUE; 
    } 
    
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_READ, OnClipRead) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    
    //      
    afx msg void CMainWin::OnClipRead() 
    < 
    COleDataObject OleOb; 
    char str[MAXSIZE] ; 
    char *p; 
    HGLOBAL hGin; 
    int i; 
    OleOb.AttachClipboard() ; 
    
    if(01eOb.IsDataAvailable(CF_TEXT) ) 
    hGin = OleOb.GetGlobalData(CF_TEXT) ; 
    else return; 
    if('hGin) { 
    MessageBox("Cannot obtain handle to data.", "Error"); 
    return; 
    532                                    MFC:   

    ) 
     = (char *) GlobalLock(hGin); 
    for (i=0; i<MAXSIZE && *p; i++) str[i] = *p++; 
    str[i] =  '\0'; 
    GlobalUnlock(hGin) ; 
    MessaqeBox (str, "Read from Clipboard"); 
    GlobalFree(hGin) ; 
    ) 
    
    //   IDM_HELP 
    afx msg void CMainWin::OnHelp () 
    { 
    MessaqeBox("Clipboard Demo", "Placeholder Help"); 
    ) 
    
    //   IDM EXIT 
    afx msg void CMainWin::OnExit() 
    { 
    int response; 
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO) ; 
    if(response == IDYES) 
    SendMessage(WM CLOSE); //   
    ) 
    CApp ; //    
    

    . . 1.      


    .  OLE                        533