forked from FauxFaux/taglibhandler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DllRegister.cpp
124 lines (110 loc) · 2.63 KB
/
DllRegister.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "dllregister.h"
#include <iostream>
LONG createRegKey(const HKEY base, const LPCWSTR name, HKEY& out)
{
return RegCreateKeyExW(base, name, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &out, NULL);
}
// Creates a registry key (if needed) and sets the default value of the key
HRESULT CreateRegKeyAndSetValue(const REGISTRY_ENTRY &pRegistryEntry,
LONG createKey(const HKEY,const LPCWSTR,HKEY &))
{
HRESULT hr;
// create the key, or obtain its handle if it already exists
HKEY hKey;
LONG lr = createKey(pRegistryEntry.hkeyRoot,
pRegistryEntry.pszKeyName,
hKey);
hr = HRESULT_FROM_WIN32(lr);
if (SUCCEEDED(hr))
{
// extract the data from the struct according to its type
LPBYTE pData = NULL;
DWORD cbData = 0;
hr = S_OK;
switch (pRegistryEntry.dwType)
{
case REG_SZ:
pData = (LPBYTE) pRegistryEntry.pszData;
cbData = ((DWORD) wcslen(pRegistryEntry.pszData) + 1) * sizeof(WCHAR);
break;
case REG_DWORD:
pData = (LPBYTE) &pRegistryEntry.dwData;
cbData = sizeof(pRegistryEntry.dwData);
break;
default:
hr = E_INVALIDARG;
break;
}
if (SUCCEEDED(hr))
{
// attempt to set the value
lr = RegSetValueExW(hKey,
pRegistryEntry.pszValueName,
0,
pRegistryEntry.dwType,
pData,
cbData);
hr = HRESULT_FROM_WIN32(lr);
}
RegCloseKey(hKey);
}
return hr;
}
HRESULT doRegistration(LPWSTR szModuleName,
LONG createKey(const HKEY,const LPCWSTR,HKEY &))
{
{
wchar_t user_profile[MAX_PATH];
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, user_profile))) {
if (wcsstr(szModuleName, user_profile) == szModuleName)
std::cout << "WARNING: you are registering this module within your user folder. Search indexing will not work unless it is registered from a system-wide path." << std::endl;
}
}
// List of property-handler specific registry entries we need to create
const REGISTRY_ENTRY rgRegistryEntries[] =
{
// COM information
{
HKEY_CLASSES_ROOT,
L"CLSID\\" SZ_CLSID_US,
NULL,
REG_SZ,
SZ_TAGLIBPROPERTYHANDLER,
0
},
{
HKEY_CLASSES_ROOT,
L"CLSID\\" SZ_CLSID_US L"\\InProcServer32",
NULL,
REG_SZ,
szModuleName,
0
},
{
HKEY_CLASSES_ROOT,
L"CLSID\\" SZ_CLSID_US L"\\InProcServer32",
L"ThreadingModel",
REG_SZ,
L"Both",
0
},
// Shell information
{
HKEY_LOCAL_MACHINE,
SZ_APPROVEDSHELLEXTENSIONS,
SZ_CLSID_US,
REG_SZ,
SZ_TAGLIBPROPERTYHANDLER,
0
}
};
HRESULT hr;
hr = S_OK;
for (int i = 0; i < ARRAYSIZE(rgRegistryEntries) && SUCCEEDED(hr); i++)
{
hr = CreateRegKeyAndSetValue(rgRegistryEntries[i], createKey);
if (FAILED(hr))
return hr;
}
return hr;
}