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 .