有3种类型的COM Server
in-process server (DLL)
提供了4个入口
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved); //当线程创建和销毁时被OS调用 STDAPI DllRegisterServer(void); //REGSVR32注册 STDAPI DllUnregisterServer(void); //REGSVR32反注册 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv); //SCM需要获得一个class object需要调用该函数 STDAPI DllCanUnloadNow(void); //当用户调用CoFreeUnusedLibraries(),COM会查询每一个in-process这个函数
out-of-process server (EXE)
system service (EXE in WinNT and above)
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd);
当在命令行中发现Register或者Unregister,local server将会注册/反注册自己
Local server在启动时,通过CoRegisterClassObject()将每个class object的IUnknown指针传给SCM
Local server在关闭时,通过CoRevokeClassObject()通知SCM其class object不再使用
COM server有3种职责
注册和反注册所有的class
为SCM提供COM class objects信息(IClassFactory)
管理server的生存期限
COM Createable and Noncreateable Classes
Createable:能够使用CoCreateInstance进行创建,并且必须提供实现了IClassFactory的class object
Noncreateable:不能使用CoCreateInstance创建,实际应用中,这些类数量远远大于Createable