Suschnost' tehnologii SOM
Authors: Boks D.
Published year:
Pages: 39-40/103
Buy this book on amazon.com >>

. ÷ DLL (server process). .

, , ÷ . . , , ÷ , CLSID . , (persistent) , . ( ) . ÷ . , , ( ) .

. 3.1. scm

÷ SCM (Service Control Manager) 1 . SCM ÷ ø. -ø, , SCM, SCM ø, . SCM , ÷ ÷ . , SCM . . 3.1, Windows NT SCM RPCSS (Remote Procedure Call Service System - ). SCM 2 API-, ÷ ( ). Windows NT ø ÷ OLE32.DLL . ø ø , ÷ RPCSS IPC (interprocess communication - ).

, ÷ . , , . , , ø. ÷ ÷ ø ø , , ÷ , ÷ (robustness), ÷ , . ÷ , . , , ÷ . ÷ SCM, .

, DLL, , -÷ . ÷ , ÷ ÷ . , , , ÷ ÷ ( threading requirements ) . ÷ , ÷ . , ÷ ÷ , . , , ø , ÷ , , ÷ ÷ DLL 3 .

( ø), , , -÷ . × ( out-of-process ) , ÷ ( ) "" ( proxy ) . 5 , ÷ "" , RPC- (Remote Procedure Call - ), , RPC- . , ÷ ÷ . ( ) ø, ø . 6 .


1 Windows NT , Service Control Manager, Services, , . ÷ NT SCM, ÷ ÷ SCM.

2 , . .

3 , ø DLL, ÷ vtbl .

SCM

, ÷ SCM ( , , ). . 3.2, ÷ 1 . . .

÷ ÷ , SCM API- CoGetClassObject . ø SCM ÷ :

HRESULT CoGetClassObject(
  [in] REFCLSID rclsid,    // which class object?
                           // Какой объект класса? 
  [in] DWORD dwClsCtx,     // locality?
                           //местонахождение?
  [in] COSERVERINFO *pcsi, // host/security info 
                           //сведения о сервере и обеспечении безопасности 
  [in] REFIID riid,        // which interface?
                           // какой интерфейс?
  [out, iid_is(riid)] void **ppv); // put it here! 
                                   // поместим его здесь!

. 3.2.

CoGetClassObject , ø . - , , ÷ - IID , , . - , , .

÷ CoGetClassObject (bitmask), ÷ (, , ). ÷ ÷ CLSCTX :

enum tagCLSCTX {
  CLSCTX_INPROC_SERVER  = 0х1, // run -inprocess
                               // запуск в процесс 
  CLSCTX_INPROC_HANDLER = 0х2, // see note

2

// смотрите сноску

2

CLSCTX_LOCAL_SERVER   = 0х4, // run out-of-process
                               // запуск вне процесса 
  CLSCTX_REMOTE_SERVER  = 0х10 // run off-host
                               // запуск вне хост-машины 
} CLSCTX;

÷ ( bit-wise -ORed together), ÷, ÷ ø CLSCTX , ( ÷, ÷ , , ÷ ). ÷ SDK ÷ , ÷ CLSCTX , ÷ :

#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER  \ 
                       CLSCTX_INPROC_HANDLER)
#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER  \
                       CLSCTX_LOCAL_SERVER  \
                       CLSCTX_REMOTE_SERVER) 
#define CLSCTX_ALL    (CLSCTX_INPROC_SERVER  \
                       CLSCTX_INPROC_HANDLER  \
                       CLSCTX_LOCAL_SERVER  \
                       CLSCTX_REMOTE_SERVER)

, ÷ , Visual Basic Java, CLSCTX_ALL , , ÷ .

CoGetClassObject - , . COSERVERINFO , ø , ÷ , :

typedef struct _COSERVERINFO { 
  DWORD       dwReserved1; // reserved, must be zero
                           // зарезервировано, должен быть нуль 
  LPWSTR      pwszName;    // desired host name, or null
                           // желаемое имя хост-машины или нуль 
  COAUTHINFO *pAuthInfo;   // desired security settings
                           // желаемые установки безопасности 
  DWORD       dwReserved2; // reserved, must be zero
                           // зарезервировано, должен быть нуль
} COSERVERINFO;

(host name), CLSCTX_REMOTE_SERVER , , ø , CLSID . , ÷ , . CoGetClassObject , COSERVERINFO .

÷ CoGetClassObject , SCM :

HRESULT GetGorillaClass(IApeClass * &rpgc) 
{
    // declare the CLSID for Gorilla as a GUID 
    // определяем CLSID для Gorilla как GUID 
  const CLSID CLSID_Gorilla = { 0x571F1680, 0xCC83, 0x11d0,
        { 0x8C, 0х48, 0х00, 0х80, 0xС7, 0х39, 0x25, 0xBA } };
    // call CoGetClassObject directly 
    // вызываем прямо CoGetClassObject 
  return CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL, 0,
      IID_IApeClass, (void**)&rpgc);
}

, ÷ ø , ÷ DLL , 3 . CoGetClassObject ø, SCM . , , ÷ .

, ÷ IApeClass , ÷ . :

HRESULT FindAGorillaAndEatBanana(long nGorillaID)
{
    IApeClass *pgc = 0;
      // find the class object via CoGetClassObject 
      // находим объект класса с помощью CoGetClassObject 
    HRESULT hr = CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL,
                                  0, IID_IApeClass, (void**)&pgc);
    if (SUCCEEDED(hr)) { 
        IApe *pApe = 0;
          // use the class object to find an existing gorilla 
          // используем объект класса для нахождения существующей гориллы 
        hr = pgc->GetApe(nGorillaID, &pApe);
        if (SUCCEEDED(hr)) {
              // tell the designated gorilla to eat a banana 
              // прикажем указанной горилле есть бананы 
            hr = pApe->EatBanana();
            pApe->Release();
        } 
        pgc->Release();
    } 
    return hr;
}

, ÷ Gorilla ø . × , , ÷ - ø - . , ÷ :

HRESULT CreateAGorillaAndEatBanana(void) 
{ 
    IApeClass *pgc = 0;
      // find the class object via CoGetClassObject 
      // находим объект класса с помощью CoGetClassObject 
    HRESULT hr = CoGetClassObject(CLSID_Gorilla, CLSCTX_ALL,
                                  0, IID_IApeClass, (void**)&pgc);
    if (SUCCEEDED(hr)) { 
        IApe *pApe = 0;
          // use the class object to create a new gorilla 
          // используем объект класса для создания новой гориллы
        hr = pgc->CreateApe(&pApe);
        if (SUCCEEDED(hr)) {
              // tell the new gorilla to eat a banana 
              // прикажем новой горилле есть бананы
            hr = pApe->EatBanana();
            pApe->Release();
        } 
        pgc->Release();
    }
    return hr;
}

, ÷ ÷ ÷ IApeClass , ÷. , , .


1 ÷ , ÷ (wire-protocol) .

2 ÷ (in-process handlers) - ÷ OLE. ÷ , ÷ , . ÷ OLE ø IPC (interprocess communication - ) . ÷ ÷ ÷ , OLE. Windows NT 5.0 ÷ ÷ , , , ÷ .

3 ÷ .

Suschnost' tehnologii SOM
Authors: Boks D.
Published year:
Pages: 39-40/103
Buy this book on amazon.com >>

Similar books on Amazon