      
     

     12 

       (dynamic-link libraries, DLLs)  
    Windows,      
.  DLL     Win32 API.    
DLL-: KERNEL32.DLL ( ,   ), 
USER32.DLL (  ,    , 
      )  GDI32.DLL (   ). 
     Windows    DLL,      
 . ,  ADVAPI32.DLL    
 ,      ,  COMDLG32.DLL  
   ( File Open  File Save), a LZ32.DLL 
  . 
        ,   Win32 DLL-  ,  
         DLL 
(       18). 

     DLL 

      DLL ,   ,    
    ,     
,   DLL   ,    
     .  DLL     
,     -  (-)   DLL.  
       ,     
-. ,  DLL,      /DLL.  
      ,   
   ,     DLL,   . 
      (  DLL)     DLL, 
        
 .       ,  
    .       . 
      DLL      
,       .  
      :     
 DLL      ,    
 .     DLL - ,  
           

    359 

    360 ______________________________Windows   

      .  ,    DLL 
       DLL  Win32   . 
    ,    DLL  VirtualAlloc,   
    ,   , 
    DLL.  DLL     
 ,    ,   
   ,     . 
,       ,   
    VirtualFree    . 
      ,      -  
    .  Windows 95  
          
  -    ,   Windows NT 
      (copy-on-write),    
5.     DLL    
.  -    DLL- |     
,        
.       ,    
DLL        . 
  Win32          , 
  . 
     16- Windows DLL-  ,   Win32. 
 DLL-        
 .  ,    ,  
  DLL      .  Win32-cpee DLL  
    ,     
  . 
        DLL-  16- Windows    
' Win32    -.    DLL 
   |   .        
 DLL, a     .    DLL  
LocalAlloc        DLL, 
 ,      ,  64 . 
           , 
    DLL   ,   
    .    DLL    
  : 

    HGLOBAL g_hData = NULL; 
    void SetData(LPVOID IpvData, int nSize) { 
    LPVOID Ipv: 
    g_hData = LocalAlloc(LMEM_MOVEABLE, nSize); 
    Ipv = LocalLock(g_hData); 
    memcpy(lpv, IpvData, nSize); 
    LocalL)nlock(g_hData); 
    } 
    void GetData(LPVOID IpvData, int nSize) { 
    LPVOID Ipv = LocalLock(g_hData); 
    memcpy(IpvData, Ipv, nSize); 
    LocalUnlock(g_hData): 
    } 

    . . . 

    ______________ 12.    361 

     SetData         DLL, ! 
   ,     IpvData,   
     g_hData.    
  GetData. ,    g_hData,  
   ,      , 
  IpvData   .   
        16- Windows. 
     Win32   : -,  DLL  Win32    
. -,        
   DLL;      
 g_hData   ,  ,    
 ,   . 

     DLL     

       ,       DLL-, 
       , 
   .       
:     DLL    DLL. 

      

      (implicit linking)     
  DLL-    .   
     LIB-.    
    DLL,     ( 
 DLL). ,     ,   
LIB-  DLL,     DLL    
.   -       
   DLL,       
  .  DLL  : 
    1. ,  -; 
    2.   ; 
    3.   Windows; 
    4.   Windows; 
    5. ,     PATH. 
      DLL  ,      (  
 ,   )    . 

     The dynamiclink library SomeLib dll could not be found in the specified path 
    F;\ADV_WIN'^86.BlN:.;H:\WNNT\System32;H:\WNNT\system:H:\WlNNT:H:\WINNTAsystem 
    32:H:\WINNT:D:WINDOWS.95:D:\WINDOWS.95\COMMAND:DWU95.20;C.-\OOS:C:\^RC;C;\ 
    UTY:C'\MOU SE;C:\TBEACH\D OSAPPS. 
    00 

    ,       
,       . 

    362 _____________________________Windows   


      

     DLL-       
 ,         LoadLibrary,  LoadLibraryEx: 

    HINSTANCE LoadLibrary(LPCTSTR IpszLibFile); 
    HINSTANCE LoadLibraryEx(LPCTSTR IpszLibFile, HANDLE hFile, DWORD dwFlags); 

        DLL- ( ,     
 )        
 .   HINSTANCE,   , 
   ,     .  
 DLL      ,  
 NULL. 
     16- Windows  LoadLibrary   ,  
  ,  32.  ,   . 
     Win32      NULL, ,    
,    GetLastError. 
    ,     2    
LoadLibraryEx: hFile  dwFlags.      NULL.  
    0,    
DONT_RESOLVE_DLL_REFERENCES, LOAD_LIBRARY_AS_DATAFILE  LOAD_WITH_ALTERED_SEARCH_PATH. 
    DONT_RESOLVE_DLL_REFERENCES    DLL  
   .  DLL,   
     DllMain (   )     
 .  ,     
 DLL,    DllMain. 
     , DLL      DLL.   
  ,     DLL;  ,  
  .    DONT_RESOLVE_DLL_REFERENCES  
DLL   .                                "'~     "' "" ~ 
    LOAD_LIBRARY_AS_DATAFILE      . DLL 
     ,    .  
          
-    . ,  DLL   
 ,     DLL-    
 ,        
 .     ,    
,       . 
          . -,   
,  DLL      .  DLL 
    ,     , 
 ,    HINSTANCE,  
LoadLibraryEx. -,   ,    , 
  - -.       
  ,    ,     
LoadLibraryEx     .   
HINSTANCE   -,       
.    -  DllMain,   LoadLibraryEx  
 -    LOAD_LIBRARY_AS_DATAFILE. 

    _______________ 12.    363 

    LOAD_WITH_ALTERED_SEARCH_PATH  ,  
LoadLibraryEx   DLL-.    ,    
. ,    ,   , 
    : 
    1. ,    IpszLibFile. 
    1.   . 
    3.   Windows. 
    4.   Windows. 
    5. ,     PATH. 
           ,     DLL.  
  : 

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ Session Manager\KnownDLLs 

           (  
   REGEDIT.EXE): 

    Registry Edit ^iew 1 
    * U MediaResources3 Name               ' Data 
    ;+._] NetworkProvider                  '^Default)            (value not set) 
    < _1 NIs                             .!^]advapi32           "advapi32.dll" 
     _J Print                            . Sjcorndlga?           "comdlg32.dU" 
    i_l PriorityConfrol                     ''aicrtdll                
"crtdll.dll"                           , 
    Gl ProductOptions                  ^DllDirectory         "%SystemRoot%\system32" 
    Cl SecurePipeServers               , L3gdi32               "gdi32.dll" 
    f <_i SecuntyProviders                ^kemelBZ            "kemel32.dll" 
    Q ServiceGrcupOrder             : : ^32                 ;lz32.dir 
    ?a ServiceProvider                  ^le32                "I63" 
    - _] Session Manager              : |             ^ 
    -., ,,   .,   ,                       ,;-.j: a3ledi32               "olecli32.dll" 
    . _1 AppPatehes                :; ;]olecnv32            "olecnv32.dll" 
    _] DOS Devices               1 ! aolesvr32            olesvr32.dll" 
    -J Environment                 ;:il; ealethk32             "olethk32.dll" 
    _| Executive                    ^ ^ ]1                "rpctH.dll" 
    _J FileRenameOpsrations     " | gSHDOCW/        "SHDOCW/.DLL" 
    : CJ Memory Management       ::;S]SHLWAPI          "SHLWAPI.DLL" 
    ' Q Subsystems              !:"'; Quser32            "user32.dll"          
            ; 
    _i Setup                       ig^version             "version.dll" 
    ;+ L] SystemResources 
    :     ! GJ TimeZonelnformation                                             
                        : 
    .!_) Update 
    _I VirtusfDeviceDrlvers            j <j__________________________j        
     
    My ComputeHKE'_LO&s^i._ACNE\SYSTEM\CurrentControlSe(\CQntrol^lSession Manager\KnownDLLs 

     ,    ,     
  DLL-.     , 
  ,    .DLL. ( 
  ,         .) 
       LoadLibrary  LoadLibraryEx,     
,    DLL    .DLL.  ,  DLL 
     . 
       .DLL ,       
  KnownDLLs    .   ,  
   .      , 
  ,       DLL.   
  DLL  ,    ,   
  DllDirectory.  Windows NT  DllDirectory  
   %SystemRoot/o\System32. 

    364 ____________________________Windows   

        ,       
KnownDLLs : 

    : SomeLib 
    ' : SomeOther-Lib. DLL 

     : 

    Load Li bra("SomeLib"): 

          .     : 

    Load Li bra("SomeLib.DLL"); 

      ,         ( 
:  \ ( /     .DLL),     
  SomeLib.DLL  SomeOtherLib.DLL.    
  SomeOtherLib.DLL   %SystemRoot%System32.   
    ,    .   LoadLibrary(Ex) 
 NULL,   GetLastError   2 (ERROR_FILE_NOT_FOUND). 
     DLL  ,       
  FreeLibrary. 

    BOOL FreeLibrary(HINSTANCE hinstDll); 

      FreeLibrary      HINSTANCE,  
  DLL.    ,  
 LoadLibrary  LoadLibrary Ex. 
       LoadLibrary  LoadLibraryEx     
  , a FreeLibrary  . ,  
  LoadLibrary   DLL    DLL- 
         
   DLL.       LoadLibrary 
   DLL  , DLL   ;    
       .   DLL   
 , FreeLibrary    :  
    1,    0. ,    
 DLL ,   .     
-        ,   
          . 
           DLL, . .   
  : 

    HINSTANCE hinstDll = LoadLibraryC'MyLib.DLL"): 

             ,  MYLIB.DLL  
    ,     DLL  
    1.       : 

    FreeLibra(hinstDll); 

       DLL    ,    
 DLL     .   DLL  
     ,    
 DLL    . 
     ,   DLL    , 
    GetModuleHandle: 

    HINSTANCE GetModuleHandle(LPGTSTR IpszModuleName); 

    ,    MYLIB.DLL,      
    : 

    ______________ 12.    365 

    HINSTANCE hinstDll; 
    hinstDll = GetModuleHandleC'MyLib");//   DLL 
    if (hinstDll == NULL) { 
    hinstDll = LoadLibraryC'MyLib"); //   DLL 
    \ 
    
         HINSTANCE  DLL,      
DLL ( ը)   GetModuleFileName: 

    DWORD GetModuleFileName(HINSTANCE hinstModule, 
    LPTSTR IpszPath, DWORD cchPath); 

          HINSTANCE    DLL.   
  ,        . ,  
,  (cchPath)     . 
     16- Windows   GetModuleUsage: 

    int GetModuleUsage(HINSTANCE hinstDll); 

        HINSTANCE  DLL,   
     DLL.    ,  
  FreeLibrary,   DLL.  16- Windows 
 DLL        
 .  Win32      
 ,    ,   GetModuleUsage  
Win32 API   . 
    "  ,  Microsoft      Win32 API, 
       DLL   .  
     ,  Microsoft    
 GetModuleUsage ,     . 
        DLL      Win32: 

    VOID FreeLibraryAndExitThread(HINSTANCE hinstDll, DWORD dwExitCode); 
       KERNEL32.DLL : 
    VOID FreeLibraryAndExitThreadCHINSTANCE hinstDll, DWORD dwExitCode) { 
    FreeLibrary(hinstDll); 
    ExitThread(dwExitCode); 
    \ 

      ,   , , ,  ,   
Microsoft   .    .   DLL, 
         
. ,  ,   DLL   
 .        FreeLibrary,  
    ExitThread. 
         FreeLibrary  ExitThread  , 
   :  FreeLibrary    DLL  
  .    FreeLibrary ,  
 ExitThread,  ,       
.         ! 
         FreeLibraryAndExitThread,   
FreeLibrary     DLL.     
  KERNEL32.DLL,       DLL. ,  
     ",    
,   . 

    366 ______________________________Windows   

    , FreeLibraryAndExitThread    .   
  ,      .     
  Windows NT 3.1,     . ,   
 ,    Windows NT 3.5  Windows 95. 

     / 

     Win32 DLL     /,   . 
      (    )   
 ,     DLL    
     .   DLL  
  ,      .   DLL, 
  .      DLL   ,  
  : 

    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID fImpLoad) { 
    switch (fdwReason) { 
    case DLL_PROCESS_ATTACH: 
    // DLL      
    break; 
    case DLL_THREAD_ATTACH: 
    //   
    break; 
    case DLL_THREAD_DETACH: 
    //    
    break; 
    case DLL_PROCESS_DETACH: 
    // DLL      
    break; 
    } 
    return(TRUE); //    DLL_PROCESS_ATTACH 
    } 

     DLL  16- Windows,   DLL  
 ,   .     
      LibMain,   
,      .  , 
    Microsoft   SDK    OBJ-, 
   ,     .                       
        
        , Win32   API,  - | 
    .  Microsoft   
- |  .     DLL      
 | ,    .  DLL, 
   16-  '  Windows,     Win32; 
,      i  .   
 ,    LibMain  WEP (Windows Exit Procedure).       
                                         > 
     16- Windows    LibMain   
,   WEP   .    , WEP  
   16- Windows (     
3.0),          .  
   

    . . . 

    ______________ 12.    367 

    WEP    LibMain;        
   .  ,    WEP  
     . ,    , 
  Win32   . 

     DllMain   LibMain  WEP 16- Windows. 

        /   . 
   hinstDll     DLL.   
hinstExe  WinMain,     ,    
DLL     .    
   ,        
 ,   ( DialogBox  LoadString).  
 DLL  ,  flmpLoad   0,      0. 
     fdwReason   ,      
.     4 : DLL_PROCESS_ATTACH, 
DLL_PROCESS_DETACH, DLL_THREAD_ATTACH  DLL_THREAD_DETACH. 

    DLL_PROCESS_ATTACH 

      DllMain     fdwReason   
,  DLL     .   
,    DLL-    .   
  LoadLibrary  LoadLibraryEx    DLL, 
       DLL;   DllMain 
   DLL_PROCESS_ATTACH  . 
     DLL_PROCESS_ATTACH,      
,   . ,  DLL   , 
    (    ).   
 DllMain     ,  HeapCreate   
 DLL_PROCESS_ATTACH,       
 ,   DLL. 
       DLL_PROCESS_ATTACH ,  
 DllMain, ,     DLL. , 
  HeapCreate  ,   TRUE.   
     FALSE.     fdwReason  
DLL_PROCESS_DETACH, DLL_THREAD_AT  DLL_THREAD_DETACH  , 
 DllMain,  . 
    , -     ,     
DllMain.          
,   -     DLL-. 
    ,     
DllMain   DLL   DLL_PROCESS_ATTACH.   
 DLL    ,    
        ,    
 WinMain (-).  DllMain     DLL  FALSE, 
    ,   ,    
    ;      
   ,     . 
          DLL?    LoadLibrary 
 LoadLibraryEx,    DLL     
  .   DllMain   
DLL_PROCESS_ATTACH,  ,  LoadLibrary  LoadLibraryEx. 
  DllMain  ,    LoadLibrary 
 LoadLibraryEx,      

    368 ______________________________Windows   

     .   DllMain  FALSE ( ), 
     DLL    
,   LoadLibrary  LoadLibraryEx  NULL. 
     16- Windows DLL- LibMain      
 DLL.     ,    CsS^^Si^ 
DLL,   LibMain  DLL   .  Win32, , 
DllMain  DLL    DLL_PROCESS_ATTACH  , 
  DLL      .  
LIBXYZ.DLL , , 10 ,  DllMain  DLL   
  DLL_PROCESS_ATTACH  10 . 

    DLL_PROCESS_DETACH 

      DLL       
 DllMain     fdwReason  DLL_PROCESS_DETACH. 
  , DLL      . 
,  HeapDestroy,   ,    
  DLL_PROCESS_ATTACH. 

    /\ 
     DllMain    DLL_PROCESS_ATTACH    
 FALSE,    ,    
      DLL_PROCESS_DETACH.   
:      ,    . 

           DllMain   
,      ( ): 

    BOOL WINAPI DllMaln(HINSTANCE hinstDll, DWORD fdwReason, LPVOID tImpLoad) { 
    static PVOID pvData = NULL; 
    BOOL fOk = TRUE; //  ,     
    switch (fdwReason) { 
    case DLL_PROCESS_ATTACH: 
    pvData = HeapAlloc(GetProcessHeap(), 0, 1000): 
    if (pvData == NULL) 
    fOk = FALSE: 
    break: 
    case DLL_PROCESS_DETACH: 
    HeapFree(GetProcessHeap(), 0, pvData); 
    break; 
    } 
    return(fOk); //    DLL_PROCESS_ATTACH 
    i 

       .   DLL   
     .     
, DllMain  FALSE,    . 
      DLL   
 . -   .   , 
 DllMain   DLL_PROCESS_  FALSE,  
     DLL_PROCESS_

    . . . 

    ______________ 12.    369 

    DETACH.  , HeapFree         
,    .   ,   
Ky~DLL_PROCESS_DETACH:                                          \ 

    case DLL_PROCESS_DETACH: 
    if (pvData != NULL): 
    HeapFree(GetProcessHeap(), 0, pvData): 
    break;                                                                     
                  \ ____________________________________________________________ 

     DLL     ,     
DllMain  ,  ExitProcess,     
.    WinMain     
   ,    ExitProcess   . 
     DLL     FreeLibrary,  DllMain 
 ,  FreeLibrary.   FreeLibrary . 
   DllMain. 

    /\ 
          TerminateProcess,   
 DllMain   DLL_PROCESS_DETACH. ,    
     DLL-   
     .      
   .  TerminateProcess     ! 

     . 12-1  ,    LoadLibrary,   
. 12-2    FreeLibrary. 

    DLLJHREAD.ATTACH 

         ,    DLL, 
        ,   
   DLL  DllMain   DLL_THREAD_ATTACH.   
  DLL-   ,    
. , DLL-      , 
       . 
              DllMain 
 DLL.    ()     
,   DLL-     
DLL_THREAD_ATTACH. "    DLL    
     ,    DllMain  
 DLL_THREAD_AT      .  
DllMain    ,   DLL   
      . 
      ,      DllMain  
 DLL_THREAD_ATTACH     .  DLL, 
        ,  
 DLL_PROCESS_ATTACH,   DLL_THREAD_ATTACH. 

    __ 12.    371 

    . 12-2. ,       FreeLibrary 

    DLLJHREAD.DETACH 

       ExitThread1,     
DLL-,        , 
     DLL  DllMain   DLL_THREAD_DETACH.  
   DLL'"~ ,    
. , DLL-      
,     . 
    1.      ExitThread,    
,    ExitThread. 

    372 _____________________________Windows   


    /\ 
       - ,       
TerminateThread,    DllMain   DLL_THREAD_DETACH. 
^^         DLL  
       ,     
 .  TerminateThread      
 ! 

       DLL   - ,    
DllMain     DLL_THREAD_DETACH.     
  DLL_PROCESS_DETACH    . 
           :   
LoadLibrary   DLL,        
 DllMain   DLL_PROCESS_ATTACH.  ,  
DLL, ,      DllMain      
 DLL_THREAD_DETACH. DLL    ,    
  DLL_THREAD_ATTACH,    .   
     ,    . 
 ,    ,  LoadLibrary  FreeLibrary 
  . 

        DliMain 
     ,    ,   .    

 :   .      DLL- 
SOMEDLL.DLL.     CreateThread,     
    D. 
             CreateThread,  
  DllMain  SOMEDLL.DLL   DLL_THREAD_ATTACH.   
   DllMain,    CreateThread    D. 
     DllMain   DLL_THREAD_ATTACH,   
       D.     
DllMain,      D,      
  DllMain      . 
      DllMain,        
.     D      
DllMain,          . 
          ,   DllMain 
.       ,     
-   ,    ,    
  DllMain.     : 

    BOOL WINAPI DllMainCHINSTANCE hinstDll, DWORD fdwReason, LPVOID fImpLoad) { 
    HANDLE hThread: 
    DWORD dwThreadId; 
    switch (fdwReason) { 
    case DLL_PROCESS_ATTACH: 
    // DLL      
    //     -  
    hThread = CreateThread(NULL, 0, SomeFunction, NULL, 0, &dwThreadId); 
    
    //        
    WaitForSingleObject(hThread, INFINITE); 

    ______________ 12.    373 
    //        
    GloseHandle(hThread); 
    break; 
    case DLL_THREAD_ATTACH: 
    //     
    break; 
    case DLL_THREAD_DETACH: 
    //    
    break; 
    case DLL_PROCESS_DETACH: 
    // DLL      
    break: 
    } 
    return(TRUE); 

     ? -    .  DllMain  
 DLL_PROCESS_ATTACH,   .    
   DllMain   DLL_THREAD_ATTACH.    
    , -   DllMain  
  DLL_PROCESS_,     . 
    WaitForSingleObject.    
    ,    .      
      ,        
   ,      DllMain.   
        . 
         ,    
DisableThreadL ibraryCa Us: 

    BOOL DisableThreadLibraryCalls(HINSTANCE hinstOU): 

        Windows NT 3.5     Windows 95. 
     .   ,   DLL_THREAD_ATTACH  
DLL_THREAD_DETACH     DllMain  DLL,    
.   ,     ,  
    DLL- . ,   
 (. ),  ,    . 

    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID fImpLoad) < 
    HANDLE hThread; 
    DWORD dwThreadId; 
    switch (fdwReason) { 
    case DLL_PROCESS_ATTACH: 
    // DLL      
    //   DllMain   
    //    
    DisableThreadLibryCalIs(hinstDll); 
    //     -  
    hThread = CreateThread(NULL, 0, SomeFunction, NULL, 0, &dwThreadId); 

    . . . 

    374 _____________________________Windows   
    

    //        
    WaitForSingleObject(hThread, INFINITE); 
    
    //        
    CloseHandle(hThread); 
    break; 
    case DLL_THREAD_ATTACH: 
    //     
    break; 
    case DLL_THREAO_DETACH: 
    //    
    break; 
    case DLL_PROGESS_DETACH: 
    // DLL      
    break: 
    } 
    return(TRUE); 

      ,   .  ,    
-.     -     
  .       
    DllMain  ,    
  . 
      CreateThread,       
  ,    WaitForSingleObject,    
-  .        
,     DllMain   DLL   
DLL_THREAD_ATTACH.      ReleaseMutex,  
 -.  - ,     , 
  DisableThreadLibraryCalls     
 . ,    ,     
 ,     DllMain   WaitForSingleObject. 

     DllMain     

      DllMain   ,  ,  
  DLL    Microsoft Visual C++.  
,    DLL      
     . ,  DLL   
   -  C++.   DLL   
 ,      ,     
 . 
      DLL       DLL- 
/.       /ENTRY.    
  Microsoft     /DLL,   ( 
),     _DllMainCRTStartup.   
         
   DLL      DLL-  
 . 
      DLL     ,   
    _DllMainCRTStartup,     DllMain. 
  DLL_PROCESS_ATTACH,  _DllMainCRTStartup 
 

    ______________ 12.    375 

            ++-. 
, _DllMainCRTStartup    DUMain. 
      DLL   DLL_PROCESS_DETACH,   
 _DllMainCRTStartup,       DUMain, 
,    , _DllMainCRTStartup     
   ++-.  _DllMainCRTStartup   
     ,    
  ( ,    DLL_THREAD_ATTACH  DLL_THREAD_DETACH). 
      ,      DLL-  
DUMain  .      ,    
   DllMain: 

    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID fImpLoad) 
{ return(TRUE); 
    } 

      DLL ,     OBJ-  DllMain, 
 DllMain   . 

         DLL 

     DLL,      ,     
  DLL-.  DLL-      
,  ,    (exported) .  
, Win32     .   
    ,      . 
        DLL  Add    
 g_nUsageCount 

    _declspec(dllexport) int Add(int nLeft, int nRight) { 
    return(nLeft + nRight); 
    \ 
    __declspec(dllexport) int g_nUsageCount = 0; 

         ,   _declspec(dllexport). 
 C/C++ ( Microsoft)      . 
  Add  g_nU sageCount,     OBJ- 
 ,     DLL  OBJ-. 
      ,   LIB-   
,   DLL.  LIB-     
-    DLL.  ,   
  ^;     (exported 
symbols).          
 ,         DLL-. 
    . 
     ,    ,   
DumpBin,     Visual C++.      
     KERNEL32.DLL  Windows 95*: 
    * . .:       KERNEL32.DLL 
 Windows 95 OSR2 ( ),     Windows 95,  
      ,    . 

    376 _____________________________Windows   

    DUMPBIN -EXPORTS KERNEL32.DLL 
    Microsoft (R) COFF Binary File Dumper Version 3.00.5270 
    Copyright (C) Microsoft Corp 1992-1995. All rights reserved. 
    Dump of file kernel32.dll 
    File Type: DLL 
    Section contains the following Exports for KERNEL32.dll 
    0  characteristics 
    328CD416  time date stamp Fri Nov 15 23:35:34 1996 
    0.00  version 
    1  ordinal base 
    782  number of functions 
    682  number of names 
    ordinal   hint  name 
    50   0     AddAtomA  (0002DBF8) 
    102   1     AddAtomW  (00034FB9) 
    103   2     AllocConsole  (0002F76B) 
    104   3     AllocLSCallback  (00021A9A) 
    105   4     AllocSLCallback  (00021ACD) 
    106   5     AreFileApisANSI  (0002EA7B) 
    107   6     BackupRead  (00035040) 
    108   7     BackupSeek  (0003502E) 
    109   8     BackupWrite  (00035040) 
    110   9     Beep  (0002B8DF) 
    111   A     BeginUpdateResourceA  (00034FD4) 
    112        BeginUpdateResourceW  (00034FD4) 
    113        BuildCommDCBA  (0002E128) 
    114   D     BuildCommDCBAndTimeoutsA  (0002E153) 
    115   E     BuildCommDCBAndTimeoutsW  (00034FEF) 
    116   F     BuildCommDCBW  (00034FD4) 
    117   10    CallNamedPipeA  (0002E041) 
    118   11     CallNamedPipeW  (00035040) 
    772   29F   IstrcmpiA  (000072AA) 
    773   2   IstrcmpiW  (00034FD4) 
    774   21    Istrcpy  (000072E4) 
    775   22   IstrcpyA  (000072E4) 
    776   2   IstrcpyW  (00034FD4) 
    777   24   Istrcpyn  (0000731E) 
    778   25   IstrcpynA  (0000731E) 
    779   26   IstrcpynW  (00034FEF) 
    780   27   Istrlen  (00007395) 
    781    28   IstrlenA  (00007395) 
    782   29   IstrlenW  (0002BB2C) 


    ______________ 12.    377 


    Summary 
    4000 .data 
    5000 .edata 
    13000 . r-sr-c 
    42000 .text 
    7000 _FREQASM 
    2000 _INIT 

     ,    ;     
     DLL.   hint   
   (  0).    ordinal ( ) 
  1     hint*. 

    /\ 
          DLL,  ; 
  .         
 16- Windows.   Win32  Microsoft     
   DLL    -  DLL-  
Wm32-y   .   ,   , 
        Win32-aopax. 

    ,      .   Microsoft Systems 
Journal   ,     . 
 Windows NT 3.1   ,      Windows 
NT 3.5.    ,      
,      . 
     ,  Microsoft    ,  
  :  (Microsoft) ,  -   
   ( )     . 
  ,      API    .   
          ,  
   . 
       DLL-      -, 
    . Microsoft ,   
        .  
            
  . 

         DLL 

      -         
 DLL,   ,      DLL.  
  ,    Add   
g_nUsageCount,  DLL-: 

    __declspec(dlllmport) int Add(int nLeft, int nRight); 
    __declspec(dllimport) int g_nUsageCount; 

    * . .:    KERNEL32.DLL  Windows 95 OSR2 
   hint  ordinal   ,   
 Windows 95 ( Windows NT 4). 

    378 _____________________________Windows   

      _declspec(dllexport), _declspec(dllimport)    , 
  C/C++  Microsoft.   , 
  Add   g_nUsageCount   DLL,    
-    .     
     (imported symbols). 
     ,        
.     -,  , 
     LIB-.  -,  
    . , ,  
LIB-   ,      
.      DLL-,    
 .      -   
   . 
     ,    ;,    
  DumpBin,   Visual C++.      
   CALC.EXE  Windows 95*: 

    DUMPBIN -IMPORTS CALC.EXE 
    Microsoft (R) COFF Binary File Dumper Version 3.00.5270 
    Copyright (C) Microsoft Corp 1992-1995. All rights reserved. 
    Dump of file calc.exe 
    File Type: EXECUTABLE IMAGE 
    Section contains the following Imports 
    SHELL32.dll 
    32A85116 time date stamp Fri Dec 06 20:00:06 1996 
    7FEOB03C   32   ShellAboutA 
    KERNEL32.dll 
    328CD42E time date stamp Fri Nov 15 23:35:58 1996 
    BFF76DCF 171   GlobalUnlock 
    BFF74904 160   GlobalAlloc 
    BFF9CF06 16D   GlobalReAlloc 
    BFF9CF28 16E   GlobalSize 
    BFF74937 161    GlobalCompact 
    BFF76DF1 167   GlobalFree 
    BFF76D8B 16B   GlobalLock 
    BFF77395 2C2   IstrlenA 
    BFF7735B 2B3   IstrcatA 
    BFF9CEBD 2A4   WriteProfileStringA 
    BFF775BD 10E   GetModuleHandleA 
    BFF77654 137   GetStartupInfoA 
    BFF88513   FO   GetEnvironmentStrings 
    BFF89F65   CO   GetCommandLineA 
    BFF91002 25D   Sleep 

    * . .:        CALC.EXE  
Windows 95 OSR2 ( ),     Windows 95. 

    ______________ 12.    379 

    BFF77270 26 IstrcmpA 
    BFF77677 132 GetProfileStringA 
    BFF9A5A3 273 UnhandledExceptionFilter
    BFF7759E 10C GetModuleFileNameA 
    BFF8BB4D B6 GetACP 
    8FF8E4BA 118 GetOEMCP 
    BFF77CA3 B9 GetCPInfo 
    BFF75794 139 GetStdHandle 
    BFF758A5 FO GetFileType 
    BFF81B11 27F VirtualFree 
    BFF7DBOO 27E VirtualAlloc 
    BFF9DOA6 1E2 RaiseException 
    BFF77C56 1C2 MultiByteToWldeChar 
    BFF77C74 28E WideCharToMultiByte 
    BFF76D5C 125 GetProcAddress 
    BFF82941 104 GetLastError 
    BFF74904 1A1 LocalAlloc 
    BFF76E13 1A8 LocalReAlloc , 
    BFF772E4 2BC IstrcpyA 
    BFF9CE4E 12E GetProfileIntA 
    BFF76980 151 GetTickCount 
    BFF74A20 1A5 LocalFree 
    BFF9137C 157 GetVersion 
    BFF8AECD 76 ExitProcess 
    BFF85C93 1FA RtlUnwind 
    USER32.dll 
    3071456F time date stamp Tue Oct 03 17:15:11 1995 
    BFF610F6 225 WinHelpA 
    BFF6235F D8 GetDC 
    BFF6456D 124 GetWindowRect 
    BFF62D94 46 CreateDialogParamA 
    BFF616AO 31 CheckRadioButton 
    BFF64BOC 168 LoadStrlngA 
    BFF62D11 196 RegisterClassExA 
    BFF6439F 114 GetSysColorBrush 
    BFF64F8F 15A LoadCursorA 
    BFF64F79 15E LoadIconA 
    BFF61631 1C6 SetDlgItemTextA 
    BFF64516 DD GetDlgItem 
    BFF62038 B9 FillPed: 
    BFF64954 1DB SetRect 
    BFF62B96 2F CheckMenuItem 
    BFF61A4C 112 GetSubMenu 
    BFF622DB F3 GetMenu 
    BFF61476 1EC SetWindowPos 
    BFF616C1 16E MapDialogRect 
    BFF62032 13B InvalidateRect 
    BFF62347 1C9 SetFocus 
    BFF64697 14D Islconic 
    BFF6437E 113 GetSysColor 
    BFF623B9 80 DestroyMenu 

    380 _____________________________Windows   

    BFF61B39 20 TrackPopupMenuEx 
    BFF61249 164 LoadMenuA 
    BFF61D94 1A2 ReleaseCapture 
    BFF6234F 1B8 SetCapture 
    BFF64550 DC GetDlgCtrlID 
    BFF62B9E A5 EnableMenuItem 
    BFF6480F 147 IsClipboardFormatAvailable 
    BFF61F52 1A3 ReleaseDC 
    BFF64627 1A9 ScreenToClient 
    BFF62391 81 DestroyWindow 
    BFF62381 190 PostQuitMessage 
    BFF6512B 78 DefWindowProcA 
    BFF623C1 175 MessageBeep 
    BFF61718 126 GetWindowTextA 
    BFF619EF 99 OrawFrameControl 
    BFF645AD CF GetClientRect 
    BFF62C68 1F6 ShowCursor 
    BFF62B5A 1CO SetCursor 
    BFF61790 AA EndPaint 
    BFF619F5 96 DrawEdge 
    BFF6173F 9 BeginPaint 
    BFF62B48 37 CloseClipboard 
    BFF64055 2A CharUpperA 
    BFF61165 D1 GetClipboardData 
    BFF62C70 187 OpenClipboard 
    BFF61508 1EE SetWindowTextA 
    BFF61F66 A7 EnableWindow 
    BFF61681 2E CheckDIgButton 
    BFF61F5A 1F9 ShowWindow 
    BFF623A9 219 UpdateWindow 
    BFF651CF 50 CreateWindowExA 
    BFF64DB6 1AF SendMessageA 
    BFF6124D 156 LoadAcceleratorsA 
    BFF64CBD FF GetMessageA 
    BFF64D22 20C TranslateAcceleratorA 
    BFF64CE9 20F TranslateMessage 
    BFF64D7C 149 IsDialogMessageA 
    BFF63E5F 86 DispatchMessageA 
    BFF638D9 176 MessageBoxA 
    GDI32.dll 
    3071456F time date stamp Tue Oct 03 17:15:11 1995 
    BFF34517  Get8tock0b]ect 
    BFF3134F 8 GetDeviceCaps 
    BFF310E1 CD GetTextMetricsA 
    BFF34D39 120 SetTextColor 
    BFF34D40 10C SetBkColor 
    BFF321A9 13D TextOutA 
    BFF31B36 C9 GetTextExtentPointA 
    BFF324E7 10D SetBkMode 
    BFF3215A 106 SelectObject 
    BFF3249F 46 DeleteObject 

    _______________ 12.    381 

    Summary 
    1000 .bss 
    2000 .data 
    1000 .idata 
    2000 .reloc 
    2000 . rsrc 
    AOOO .text 

      -      
,    ,       
      DLL.    
 ,  -,   . 
,   - ,      
.  ,        
,        
    .     
   (hint);    
  .      
       - DLL.2 
     ,   _declspec(dllimport)  
 .        extern.  
    ,    ,  
    DLL.      
    _declspec(dllimport). 
         DLL     GetProcAddress: 

    FARPROC GetProcAddress(HINSTANCE hinstDll, LPCSTR IpszProc); 

     hinstDll  DLL.       
LoadLibrary  LoadLibraryEx.  IpszProc     
. -,        ,   
  : 

    Ipfn = GetProcAddress(hinstDll, "SomeFuncInDll"); 

    :   IpszProc  LPCSTR,   LPCTSTR.  ,  
 GetProcAddress   ANSI-     
Unicode-.    ,       
  DLL    ANSI-. 
       IpszProc     
 : 

    Ipfn = GetProcAddress(hinstDll, MAKEINTRESOURCE(2)): 

     ,      (2)  
SomeFuncInDll,     DLL.   : Microsoft 
     ;    
    GetProcAddress. 
          DLL  SomeFuncInDll.  
  , GetProcAddress  NULL.   ,   
   .  ,     
    .  ,     
,       , GetProcAddress  
 ,   NULL. ( 
    2.  DLL     BIND.  Visual C++   
,    Win32 SDK. 

    382 _____________________________Windows   

       16- Windows.)    ,   
,   .      
      .       
   Windows         
     .    . ( , 
,    ,       
      .) 

      DLL 

       DLL     ,  
    DLL   .    
  -.         
 DLL.            
    ,   DLL-,    : 

    // MYLIBAPI     MyLib.C  __declspec(dllexport). 
    //       MyLib.C,   
    // ,   . 
    Bifndef MYLIBAPI 
    ^define MYLIBAPI __declspec(dllimport) 
    ffendif 
    
    MYLIBAPI int Add(int nLeft, int nRight); 
    MYLIBAPI int g_nUsageCount; 
               
DLL  : 
    //    MYLIBAPI  __declspec(dllexport)   
    //  MyLib.H.  MyLib.H, "",     MYLIBAPI, 
    //   ()   __declspec(dllimport). 
    ffdefine MYLIBAPI __declspec(dllexport) 
    ftinclude "MyLib.H" 
    Illllllllllllllltttllllllllllllllllllllllllllllllllllllllllllllllllllllllltlllllll 
    int Add(int nLeft, int nRight) { 
    retLirn(nLeft + nRight); 
    } 
    MYLIBAPI int g_nUsageCount; 

     MYLIBAPI   _declspec(dllexport) ,   
      ,   
.      _declspec(dllexport)   
  .  ,     Add  _declspec(dllexport). 
       ,   DLL ,   
       .  MYLIBAPI  


    ______________ 12.    383 

      _declspec(dllimport),   ,   
  DLL.    Windows,  WINUSER.H, 
 ,  Microsoft    . 

     DLL       ( Visual C++) 

       Visual C++    DLL,     
 ,     ,     
  .     DLL  Visual C++,  -   
     ,    
 . 
      ,        (  C++) 
     _stdcall.  -   
 ,  Visual C++  (mangles)  :  
  ,     ,    
@   ,     . , : 

    __declspec(dllexport) LONG __stdcall MyFunc(int a, int b): 

     Visual C++    DLL  _MyFunc@8.   
  -       ,  
    _MyFunc,     DLL, 
 Visual C++, , ,  . 
       Visual C++  DLL,    
   ,   Visual C++  
   .     . 
       DEF-     Visual C++    
  EXPORTS: 

    EXPORTS 
    MyFunc 

     Visual C++,   DEF-, ,  
   : _MyFunc@8  MyFunc.    
 (   ),    
  DEF-      MyFunc,  
_@8   . 
    ,  ,    -   DLL  Visual C++ 
,   _MyFunc@8,    ?     
  ,  Visual C++      
 -   MyFunc. 
          DEF-,   
    _.      
  DLL  : 

    ftpragma comment(linker. "/export;MyFunc=_MyFunc@8") 

           MyFunc  
   ,   _MyFunc@8.    ,  , 
         
 .        ,   DLL 
       : MyFunc  MyFunc@8, 
        MyFunc.  ,  
            DEF-. 

    384 ______________________________Windows   

    ,    ++-      
   ,    
  Win32      .   
     DLL-,  ++-,   
  ,     DLL-   ,  
  . 

           DLL 

       ,      
   ,    -  DLL- 
   .  ,        
  2    ,      
, . .      .   
  ,  .   ,     
   . 
    ,  Win32   ,  ,  
   .       ,   
 ,       .   
          
  (   ) ,   
 1,   ,      ,  
       . 
         ,   
      DLL.    
 -  . 

      -  DLL- 

      -  DLL-     (sections).  
       . ,  
       .text, 
     .bss,      .data. 
          : 

            

    READ             . 
    WRITE            . 
    EXECUTE         . 
    SHARED           . 

      DumpBin,      -  
DLL.        MODULE.DLL ( 
-,   ): 

    Microsoft (R) COFF Binary File Dumper Version 3.00.5270 Copyright () 
Microsoft Corp 1992-1995. All rights reserved. 
    Dump of file module.oil 


    _______________ 12.    385 


    File Type: DLL 
    Summary 
    1000 .data 
    1000 .idata 
    1000 . rdata 
    1000 . reloc 
    1000 .text 
    1000 Shared 

         ,    
 ,    DumpBin  -HEADERS.    
  : 

         

    .text              DLL. 
    .bss            . 
    .rdata             . 
    .rsrc             . 
    .edata            . 
    .data            . 
    .xdata             . 
    .idata            . 
    .CRT              . 
    .reloc                (fixup table). 
    .debug          . 
    .tis               . 

    :     Shared  MODULE.DLL  . 
       -  DLL-,   : 

    ffpragma data_seg("segname") 

    ,   MODULE.C   : 
    
    #pragma data_seg("Shared") 
    LONG g_lModuleUsage = 0; 
     data_seg() 

      ,    Shared     
  ,    #pragma.  
    Shared   g_lModuleUsage.  
#pragma data_seg()  ,       
     ,    Shared.  ,  
       ; 
     .bss.      
    -  , 
      .bss: 

    #pragma data_seg("Shared") 
    LONG g_lModuleUsage; 
    
    #pragma data_seg() 


    386 _____________________________Windows   

          ,    
     DLL.     
   .       
,         DLL;  
           
   DLL. 
    ,    ,    
   -  .    ,  
      .     
/SECTION : 

    /SECTION;, 

        ,     . 
      MODULE.DLL      Shared.  
    ,  .    
 : 
    R (READ), W (WRITE), E (EXECUTE)  S (SHARED). ,   Shared 
 ,   ,    : 

    /SECTION:Shared,RWS 

           ,   /SECTION 
        . 
             : 

    ftpragma comment(linker, "/SECTION:Shared,RWS") 

         /SECTION: Shared,RWS   
 .drectve. ,  OBJ-,   
.drectve  OBJ   ,      
     .       
:       ,     
    Build Settings  Visual C++.  ,  
        CmnHdr.H (. 
 ). 
     ,      , Microsoft 
    . -,   
      (B-level security). -,  
  ,         
,           . 
    ,   2 ,      
  .     -   
:          , 
      .      
  ,      . 
       .       
  DLL,    ,   ,   
  .    ,       
,  ,   ,   ,  
 DLL,      .    
,      . 
            
 ,      .  ,  
       . 
         ,    -  
  DLL   .     
  ,  LoadLibrary,    DLL. 

    ______________ 12.    387 


    - ModUse 

     ,  Win32    GetModuleUsage  
16- Windows.        
 .   ,   MODUSE.EXE  
MODULE.DLL.           
 MODUSE  -,   .   
MODULE.DLL (.   . 12-3). 

    MODULE.C 
    : Module. 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    #include "..\CmnHdr.H"           /* .   */ 
    ^include <windows.h> 
    ffdefine MODULEAPI __declspec(dllexport) 
    ftinclude "Module.H" 
    //////////////'////////;//,'-!:!./^/i'^/":'^'fi^//f"//':l ! !     1' 
    //     g_lModuieUsage  01 
    //     Shared.   ,   
    //          . 
    ftpragma data_seg("Shared") 
    LONG g_lModuleUsage = 0; 
    ftpragma data_seg() 
    //     Shared  
    //    ,    
    ftpragma comment(linker, "/section:Shared,rws") 
    ///////////////"/'/////'!///'!/'//"/////''"'/'/m//f///'//f'///'"///"" 
    II g_uMsgModCountChang'e    ,       
    UINT g_uMsgModCntChange = 0; 
    llllllllllllllllllllll//////l/l/!:i!!|!i!!l^i!i^^!!!i!l!!! "! ' ^ 'i''/"" 
    BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID 
IpvReserved) { 
    switch (fdwReason) { 
    case DLL_PROCESS_ATTAGH: 
    // DLL      
    //     DLL 
    //      
    InterlockedIncrernent((PLONG) &g_lModuleUsage); 

    . . . 

    . 12-3.     Module 


    388 ______________________________Windows   


    . 12-3   () 

    II     ,   
    //          
    //    . 
    Q_uMsQModCntChange = RegisterWindowMessage(__TEXT("MsgModUsgCntChange")); 
    
    //        
    //      
    PostMessage(HWND_BROADCAST, g_uMsgModGntChange, , ); 
    Preak; 
    case DLL_THREAD_ATTACH: 
    //       
    break; 
    case DLL_THREAD_DETACH: 
    //    
    break; 
    case DLL_PROCESS_DETACH: 
    // DLL      
    
    //     DLL 
    //      
    InterlockedDecrement((PLONG) &g_lModuleUsage); 
    
    //        
    //      
    PostMessage(HWND_BROAOCAST, g_uMsgModCntChange. , 0); 
    break; 
    } 
    return(TRUE); 
    /////////////////////////////////////////////////////////////////////////////// 
    MODULEAPI LONG GetModuleUsage (void) { 
    return(g_lModuleUsage); 
    } 
    IHIIIIIIIIIIIIIIII/IIIH//11/1111   111/11111111111111111111111111111 

    MODULE.H 
    /....,*.*****....***......****.,...*,*****.,*,.,....*..*,..,.*......,******. 
    ; Module.H 
    : Copyright  1995-1997,   (Jeffrey Richter) 

    . . . 


    _______________ 12.    389 


    . 12-3  () 

    #lf !defined(MODULEAPI) 
    define MODULEAPI __declspec(dllimport) 
    #endif 
    // ,       
    MODULEAPI LONG GetModuleUsage (void); 
    I 1111111111.111111/1111111111111111   1111111111111 i 111111 
/111 111111111 

       MODULE. ,      
g_lModuleUsage   ,   ( /SECTION),  
  .     0.  ,  MODULE.DLL 
    , DllMain   
 DLL_PROCESS_ATTACH.    : 

    InterlockedIncre(nent(&g_lModuleUsege): 

          1. ,  ,   
    Interlockedlncrement  ,   : 

    g_lModuleUsage++: 

    :          
 . ,       - 
,    .     
 LoadLibrary   MODULE.DLL,  g_lModuleUsage  
 .      Interlockedlncrement,  
,        4     
   . 
     ,      MODULE.DLL,  
     DllMain   DLL_PROCESS_DETACH.  
  InterlockedDecrement.    Interlockedlncrement 
 InterhckedDecrement .  10. 
     DllMain,   DLL     GetModuleUsage-. 

    LONG GetModuleUsage(void); 

       ;      
g_lModuleUsage.     ,  , 
   MODULE.DLL    . 
       ,    ModUse (MODUSE.EXE) (. 
  . 12-4).   ,     
,    3 MsgModCntChange,  
  MODULE.DLL,    DllMain   
 DLL_PROCESS_ATTACH.     MODUSE.EXE  
   WinMain.       
g_uMsgModCntChange. 
     DLL       ,  : 

    PostMessage(HWND_BROADCAST, g_uMsgModCntChange, , ); 

             
   .        
  , 3,      . 
  RegisterWindowMessage   Microsoft Win32 
Programmer's Reference. 

    390 _____________________________Windows   

       ModUse.     
MODUSE.C  ; 
         *: 

    if (uMsg == g_uMsgModCntChange) { 
    SetDlgIternInt(hDlg, IDC_MODCNT, GetModuleUsage(), FALSE):                 
    } 

      ,    DLL  
GetModuleUsage,     .    
     ()    
 . 
       ModUse  MODULE.DLL    
  .  DLL     
     .   ,  
  ModUse,   .    
ModUse,   ,  GetModuleUsage  DLL,   
  (  1),      : 

    ^HWMWM-l^t 
    Module usage:     1                                                        
              ' 
        ModUse     
-  ' .     MODULE.DLL  2;     
, -  j    .   
  -  |  GetModuleUsage, ,    2,  
    :                                
                                ] 
    |.||.1-   .-.. : ..    .^-l2J 
    Module usage:     2      Module usage:     2 

       ,     
,        DLL,    .  
       . 

    MODUSE.C 
    : ModUse. 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    ^include "..\CmnHdr.H"              /* .   */ 
    ftinclude <windows.h> 
    ttinclude <windowsx.h> 
    ftinclude <tchar.h> 
    ^include "Resource.H" 
    #lnclude "..\Module\Module.H" 

    . . . 

    . 12-4.   ModUse 

    * . .:    MODUSE.C  IDC_MODCNT  IDC_USAGECOUNT. 


    _________ 12.    391 


    . 12-4  () 


    IIIIHIIIIIIIIIIIIIIIIIIIII/ll/llll/lll/lllfllll/lll/lllll/llllllllllllllllllll 
    UINT g_uMsgModCntChange = 0; 
    ////////////////////////////////////////////////////////////1////.1.1 
//".,  
    BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus, LPARAM IParam) { 
    //      
    chSETDLGICONS(hwnd, IDI_MODUSE, IDI_MODUSE); 
    //      
    Pos"EMessage(hwnd, g_uMsgModCntChange, , ); 
    return(TRUE); 
    \ ( 
    !llllll/IIIIIIIIHt//ll//lll/llll/lll//ill/l//llll/illlllllllllllllllllllllllll 
    void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtI, UINT codeNotify) { 
    switch (id) { 
    case IDCANCEL: 
    EndDialog(hwnd, id); 
    break; 
    } 
    ! 
    //////////////////////////////////////////////7/////1-//////7/,/.11//.// 
 '   " ',1'',/11/1  
    BOOL CALLBACK Dlg_Proc (HWND hwnd, UINT uMsg, WPARAM wParain, LPARAM 
IParam) { 
    if (uMsg == g_uMsgModCntChange) { 
    SetDlgItemInt(hwnd, IOC_USAGECOUNT, 
    GetModuleUsageO, FALSE); 
    } 
    switch (uMsg) { 
    chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog); 
    chHANDLE_DLGMSG(hwnd. WM_COMMAND, Dlg_OnCommand); 
    } 
    return(FALSE); 
    } 
    ltlllllllllt/lll/lll/l/l/l/l//lll/l/ll////lllll/lllllllll/lllllllll/lllllllllll 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    chWARNIFUNICODEUNDERWIN95(); 

    . . . 

    392 _____________________________Windows   


    . 12-4  () 

    II     ,  
    // DLL         
    //    
    9_uMsgModCntChange = RegisterWindowMessage(__TEXT("MsgModUsgCntChange")); 
    DialogBox(hinstExe, MAKEINTRESOURCE(IDD_MODUSE), NULL, Dlg_Proc); 
    return(O); 
    111111111/11/11/IIIIIIIIIIIIHIIII   1111//11111111111//11111111111111 


    - Multlnst 

     16- Windows     hinstExePrev 
 WinMain ,     - . 
,      ,   
hinstExePrev  ,     NULL.  Win32   
 NULL.   Win32    ,    
 . 
             
   .  Multlnst (MULTINST.EXE) (. 
  . 12-5) ,       
.           
 MULTINST  -,   . 
    MULTINST.C 
    /.*,**,,,***..***,...***.***,*.,.**.,.***..*,^. .,*..... *.,........,*....,. 
    : Multlnst. 
    : Copyright  1995-1997,   (Jeffrey Richter) 
    .**.,.,**,.*,*,**,..***..**,***.****.******,.*....*,..,.**..,*..,****.****,.*/ 
    
    ftinclude ".,\CmnHdr,H"              /* .   */ 
    ttlnclude <windows.h> 
    ftinclude <tchar.h> 
    tfinclude "Resource.H" 
    Illlllllllllllllll/l/lllllll/lllllllllllllllllilllllllli/lllltll/llllllllllllll 
    
    II     g_lModulel)sage   
    //     Shared.   ,   
    //          . 
     data_seg("Shared") 
    LONG g_lUsageCount = -1; 
    #pragma data_seg() 
    //     Snared  
    //    ,    
    ffpragma con)ment(linker, "/section:Shared, rws") 

    . . . 

    . 12-5.   Multlnst 

    _____________ 12.    393 


    . 12-4  () 
    llll/1111111111111111111/ill/illllllllll/lllllllllll/llllll/lllllllllllllllllll 
    int WINAPI _tWinMain (HINSTANCE hinstExe, 
    HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) { 
    //  :   
    BOOL fFirstInstance = (InterlockedIncrement(&g_lUsageCount) == 0); 
    chWARNIFUNICODEUNDERWIN95(); 
    //     ,    
    //     
    if (!fFirstInstance) { 
    MessageBox(NULL, 
    
    __("Application is already running - ") 
    __TEXT("Terminating this instance."), 
    __TEXT("Multiple Instance"), 
    MB_OK | MB_ICONINFORMATION); 
    } else { 
    //  -   : 
    // ,      
    MessageBox(NULL, 
    
    __("Running first instance of application.\n") 
    __TEXT("Select OK to terminate."), 
    __TEXT("Multiple Instance"), 
    MB_OK | MB_ICONINFORMATION); 
    } 
    //    :   
    InterlockedDecrecnent(&g_lusageCount): 
    return(O): 
    } 
    ////////////////////////   I / I I 11 i I 11 11 i I I I I i i I 
