157 lines
4.5 KiB
C++
157 lines
4.5 KiB
C++
#include <windows.h>
|
|
#include <strsafe.h> // for StringCchXXX functions
|
|
#include <olectl.h> // for SELFREG_E_CLASS
|
|
#include <shlobj.h> // for ICatRegister
|
|
#include "ClassFactory.h" // for the class factory
|
|
|
|
// {46B3D3EF-071A-4b7e-8AA2-E560810DAB35}
|
|
CLSID CLSID_DeskBandSample = {0x46b3d3ef, 0x71a, 0x4b7e, {0x8a, 0xa2, 0xe5, 0x60, 0x81, 0xd, 0xab, 0x35}};
|
|
|
|
HINSTANCE g_hInst = NULL;
|
|
long g_cDllRef = 0;
|
|
|
|
STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, void *)
|
|
{
|
|
if (dwReason == DLL_PROCESS_ATTACH)
|
|
{
|
|
g_hInst = hInstance;
|
|
DisableThreadLibraryCalls(hInstance);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
|
|
{
|
|
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
|
|
|
|
if (IsEqualCLSID(CLSID_DeskBandSample, rclsid))
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
|
|
CClassFactory *pClassFactory = new CClassFactory();
|
|
if (pClassFactory)
|
|
{
|
|
hr = pClassFactory->QueryInterface(riid, ppv);
|
|
pClassFactory->Release();
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDAPI DllCanUnloadNow()
|
|
{
|
|
return g_cDllRef > 0 ? S_FALSE : S_OK;
|
|
}
|
|
|
|
HRESULT RegisterServer()
|
|
{
|
|
WCHAR szCLSID[MAX_PATH];
|
|
StringFromGUID2(CLSID_DeskBandSample, szCLSID, ARRAYSIZE(szCLSID));
|
|
|
|
WCHAR szSubkey[MAX_PATH];
|
|
HKEY hKey;
|
|
|
|
HRESULT hr = StringCchPrintfW(szSubkey, ARRAYSIZE(szSubkey), L"CLSID\\%s", szCLSID);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = E_FAIL;
|
|
if (ERROR_SUCCESS == RegCreateKeyExW(HKEY_CLASSES_ROOT,
|
|
szSubkey,
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hKey,
|
|
NULL))
|
|
{
|
|
WCHAR const szName[] = L"DeskBand Sample";
|
|
if (ERROR_SUCCESS == RegSetValueExW(hKey,
|
|
NULL,
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE) szName,
|
|
sizeof(szName)))
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = StringCchPrintfW(szSubkey, ARRAYSIZE(szSubkey), L"CLSID\\%s\\InprocServer32", szCLSID);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = HRESULT_FROM_WIN32(RegCreateKeyExW(HKEY_CLASSES_ROOT, szSubkey,
|
|
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
WCHAR szModule[MAX_PATH];
|
|
if (GetModuleFileNameW(g_hInst, szModule, ARRAYSIZE(szModule)))
|
|
{
|
|
DWORD cch = lstrlen(szModule);
|
|
hr = HRESULT_FROM_WIN32(RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE) szModule, cch * sizeof(szModule[0])));
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
WCHAR const szModel[] = L"Apartment";
|
|
hr = HRESULT_FROM_WIN32(RegSetValueExW(hKey, L"ThreadingModel", 0, REG_SZ, (LPBYTE) szModel, sizeof(szModel)));
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT RegisterComCat()
|
|
{
|
|
ICatRegister *pcr;
|
|
HRESULT hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pcr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CATID catid = CATID_DeskBand;
|
|
hr = pcr->RegisterClassImplCategories(CLSID_DeskBandSample, 1, &catid);
|
|
pcr->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
STDAPI DllRegisterServer()
|
|
{
|
|
// Register the deskband object.
|
|
HRESULT hr = RegisterServer();
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Register the component category for the deskband object.
|
|
hr = RegisterComCat();
|
|
}
|
|
|
|
return SUCCEEDED(hr) ? S_OK : SELFREG_E_CLASS;
|
|
}
|
|
|
|
STDAPI DllUnregisterServer()
|
|
{
|
|
WCHAR szCLSID[MAX_PATH];
|
|
StringFromGUID2(CLSID_DeskBandSample, szCLSID, ARRAYSIZE(szCLSID));
|
|
|
|
WCHAR szSubkey[MAX_PATH];
|
|
HRESULT hr = StringCchPrintfW(szSubkey, ARRAYSIZE(szSubkey), L"CLSID\\%s", szCLSID);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (ERROR_SUCCESS != RegDeleteTreeW(HKEY_CLASSES_ROOT, szSubkey))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
return SUCCEEDED(hr) ? S_OK : SELFREG_E_CLASS;
|
|
}
|