SCM

SCM

COM- (Service Control Manager SCM) CLSID . SCM . , ( ), DLL, LocalServer32 InprocServer32, :

 [HKCR\CLSID\{27EE6A26-DF65-11d0-8C5F-0080C73925BA}] @="Gorillaquot; [HKCR\CLSID\{27EE6A26-DF65-11d0-8C5F-0080C73925BA}\LocalServer32] @="C:\ServerOfTheApes.exe" 

, . , DllRegisterServer DllUnregisterServer. /RegServer /UnregServer 1. , SCM ServerOfTheApes. , Gorilla. SCM , , .

3, SCM , . COM (CoGetClassObject, CoCreateInstanceEx CoGetInstanceFromFile). , , , . . 3, , DLL COM, DllGetClassObject. , .

SCM. , , 2. SCM API- CoRegisterClassObject:

 HRESULT CoRegisterClassObject(           [in] REFCLSID rclsid, // which class?                                 //    ?           [in] IUnknown *pUnkClassObject, // ptr to class object                                           //                  [in] DWORD dwClsCtx,    // locality                                   //            [in] DWORD dwRegCls,    // activation flags                                   //              [out] DWORD *pdwReg);   // association ID                                   // ID  

CoRegisterClassObject COM , , CLSID . , , COM SCM, . CoRegisterClassObject (DWORD), CLSID . ( SCM , CLSID) API- CoRevokeClassObject:

 HRESULT CoRevokeClassObject([in] DWORD dwReg);                              // association ID                              // ID  

DWORD CoRegisterClassObject. , .

, , CoRegister lassObject . COM :

 typedef enum tagREGCLS {     REGCLS_SINGLEUSE      = 0, // give out class object once                                //            REGCLS_MULTIPLEUSE    = 1, // give out class object many                                //            REGCLS_MULTI_SEPARATE = 2, // give out class object many                                //            REGCLS_SUSPENDED      = 4, // do not notify SCM (flag)                                 //     SCM ( )     REGCLS_SURROGATE      = 8  // used with DLL Surrogates                                //       DLL } REGCLS; 

REGCLS_SURROGATE DLL, . REGCLS_SINGLEUSE REGCLS_MULTIPLEUSE. COM . , COM (public view). , COM . CLSID, COM .

, REGCLS_MULTIPLEUSE , , , CoRevoke lassObject COM. REGCLS_MULTI_SEPARATE , . REGCLS_MULTIPLEUSE, COM , , . , CLSCTX_LOCAL_SERVER, . , , REGCLS_MULTI_SEPARATE. COM , CLSCTX_INPROC_SERVER. , CoRegisterClassObject:

 hr = CoRegisterClassObject(CLSID_Me, &g_coMe,                            CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dw); 

:

 hr = CoRegisterClassObject(CLSID_Me, &g_coMe,                            CLSCTX_LOCAL_SERVER | CLSCTX_INPROC,                            REGCLS_MULTI_SEPARATE, &dw); 

, :

 hr = CoGetClassObject(CLSID_Me, CLSCTX_INPROC, 0,                       IID_IUnknown, (void**)&pUnkCO); 

DLL . COM , , CoRegisterClassObject. , , CoRegisterClassObject :

 hr = CoRegisterClassObject(CLSID_Me, &g_coMe,                            CLSCTX_LOCAL_SERVER,                            REGCLS_MULTI_SEPARATE, &dw); 

CLSID_Me, , DLL .

CoRegisterClassObject . , . , , IClassFactory, CreateInstance . CreateInstance , , , , , 3.

. , , , CoRegisterClassObject. , , , , . , COM Windows NT 4.0 REGCLS_SUSPENDED. CoRegister lassObject COM SCM , . . COM CLSID ; . COM API- CoResumeClassObjects:

 HRESULT CoResumeClassObjects(void); 

CoResumeClassObjects . - , . - , SCM , , . , SCM , .

API- , , . , :

 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {       // define a singleton class object for each class       //              static GorillaClass   s_gorillaClass;     static OrangutanClass s_orangutanClass;     static ChimpClass     s_chimpClass;     DWORD rgdwReg[3];     const DWORD dwRegCls = REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED;     const DWORD dwClsCtx = CLSCTX_LOCAL_SERVER;       // enter the MTA       //          HRESULT hr = GoInitializeEx(0, COINIT_MULTITHREADED);     assert(SUCCEEDED(hr)) ;       // register class objects with  M library's class table       //                //       COM     hr = CoRegisterClassObject(CLSID_Gorilla, &s_gorillaClass,            dwClsCtx, dwRegCls, rgdwReg);     assert(SUCCEEDED(hr));     hr = CoRegisterClassObject(CLSID_Orangutan,            &s_orangutanClass, dwClsCtx, dwRegCls, rgdwReg + 1);     assert(SUCCEEDED(hr)) ;     hr = CoRegisterClassObject(CLSID_Chimp, &s_chimpClass,            dwClsCtx, dwRegCls, rgdwReg + 2);     assert(SUCCEEDED(hr));       // notify the SCM       //   SCM     hr = CoResumeClassObjects();     assert(SUCCEEDED(hr));       // keep process alive until event is signaled       //      ,            extern HANDLE g_heventShutdown;     WaitForSingleObject(g_heventShutdown, INFINITE);       // remove entries from COM library's class table       //             COM     for (int n = 0; n < 3; n++)         CoRevokeClassObject(rgdwReg[n]);       // leave the MTA       //   MTA     CoUninitialize();     return 0; } 

, (Win32 Event object) - :

 HANDLE g_heventShutdown = CreateEvent(0, TRUE, FALSE, 0); 

, API- SetEvent:

 SetEvent(g_heventShutdown); 

. STA, Win32 Event (windows message pump). , ORPC- .


1 -RegServer -UnregServer. (case).

2 , , , / windows- .

3 CreateInstance . CreateInstance .



Suschnost' tehnologii SOM
Essential COM
ISBN: 0201634465
EAN: 2147483647
Year: N/A
Pages: 103
Authors: Don Box

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net