COM的宿主文件DLL 的构成:Server.cpp 和 Sever.def。
Server.cpp 定义四个供windows、COM运行库和一些组件注册工具(如REGSVR32.EXE)使用的标准函数,如以下:
//
// DllMain -
// Called by Windows when important events happen
// to the DLL. In particular, we are interested when
// the DLL is initially loaded. When this ocurrs, we
// save the instance handle for later use.
// 当DLL文件被Windows加载时,由Windows调用的DLL入口函数(或初始化函数)
//
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
。。。。。。。。。
}
//
// DllGetClassObject -
// Called by COM to retrieve a component's class factory
// implementation.
// 由COM运行库调用来获取一个组件工厂的实现
// 通过工厂类的GUID即CLSID获取工厂类的IClassFactory接口,再调用接口的CreateInstance方法通过IID获取组件接口实例
//
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppv )
{
。。。。。。。。。
}
//
// DllCanUnloadNow -
// Called by COM to determine if this housing (DLL)
// can be unloaded
// 由COM调用来决定这个DLL宿主文件是否可以卸载出内存。
//
STDAPI DllCanUnloadNow(void)
{
if ( g_lObjs || g_lLocks )
return( S_FALSE );
else
return( S_OK );
}
//
// DllRegisterServer - Entry point called by utilities such as
// REGSVR32.EXE to update the registry with the appropriate
// values for each component type in this DLL housing.
// 由如REGSVR32.EXE之类的工具来调用以进行组件的注册表注册的函数
//
STDAPI DllRegisterServer(void)
{
。。。。。。。。
}
//
// DllUnregisterServer - Entry point called by utilities such as
// REGSVR32.EXE to remove any registry values
// for the COM components in this housing.
// 由如REGSVR32.EXE之类的工具来调用以进行组件的注册表卸载清理的函数
//
STDAPI DllUnregisterServer(void)
{
// For now, don't do anything...
return S_OK;
}
另外Server.def 文件的内容如下:它定义DLL文件公布出来的可以由其它调用者进行调用的函数。
;
; Server.def : Declares the module parameters for the DLL.
;
LIBRARY "SERVER"
DESCRIPTION 'SERVER Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
如上所示,组件公布出了三个函数供COM运行库和REGSER32.EXE 进行调用的函数。