, 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 note2 // 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 .