|
Suschnost' tehnologii SOM Authors: Boks D. Published year: Pages: 39-40/103 |
. ÷ DLL (server process). .
, , ÷ . . , , ÷ , CLSID . , (persistent) , . ( ) . ÷ . , , ( ) .
÷ 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 ( , , ). . 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!
// поместим его здесь!
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 |