1,DllMain
2,DllGetClassObject
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
{
// CLSID_SdkDeskBand这个就是自定义COM的CLSID
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
if ( TRUE == IsEqualCLSID(rclsid, CLSID_SdkDeskBand) )
{
hr = E_OUTOFMEMORY;
// 这就是我们自己实现类工厂,它可创建出我们自大定义的COM对象
SdkClassFactory *pClassFactory = new SdkClassFactory();
if ( NULL != pClassFactory )
{
hr = pClassFactory->QueryInterface(riid, ppv);
}
SAFE_RELEASE(pClassFactory);
}
return hr;
}
3,DllCanUnloadNow
STDAPI DllCanUnloadNow()
{
// g_lDllRefCount是当前DLL的引用计数,
// 如果这个变量值为0的话,说明可以卸载该DLL,否则不可以。
return (g_lDllRefCount > 0) ? S_FALSE : S_OK;
}
4,DllRegisterServer
5,DllUnregisterServer
// Find handle to the task bar.
// hTaskbarWnd是Desk Band对象的容器
HWND hTaskbarWnd = FindWindow(L"Shell_TrayWnd", NULL);
// If task bar receives this message, it will call CoFreeUnusedLibraries function
// immediately to free unused libraries.
PostMessage(hTaskbarWnd, WM_TIMER, 24, 0);