Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

576 lines
18 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1994 - 1997.
  5. //
  6. // File: snapin.cpp
  7. //
  8. // Contents: DLL support routines, class factory and registration
  9. // functions.
  10. //
  11. // Classes:
  12. //
  13. // Functions:
  14. //
  15. // History: 2-12-1998 stevebl comment header added
  16. //
  17. //---------------------------------------------------------------------------
  18. #include "precomp.hxx"
  19. #include "initguid.h"
  20. #include "gpedit.h"
  21. extern const CLSID CLSID_Snapin = {0xBACF5C8A,0xA3C7,0x11D1,{0xA7,0x60,0x00,0xC0,0x4F,0xB9,0x60,0x3F}};
  22. extern const wchar_t * szCLSID_Snapin = L"{BACF5C8A-A3C7-11D1-A760-00C04FB9603F}";
  23. extern const CLSID CLSID_MachineSnapin = {0x942A8E4F,0xA261,0x11D1,{0xA7,0x60,0x00,0xc0,0x4f,0xb9,0x60,0x3f}};
  24. extern const wchar_t * szCLSID_MachineSnapin = L"{942A8E4F-A261-11D1-A760-00C04FB9603F}";
  25. // Main NodeType GUID on numeric format
  26. extern const GUID cNodeType = {0xF8B3A900,0X8EA5,0X11D0,{0X8D,0X3C,0X00,0XA0,0XC9,0X0D,0XCA,0XE7}};
  27. // Main NodeType GUID on string format
  28. extern const wchar_t* cszNodeType = L"{F8B3A900-8EA5-11D0-8D3C-00A0C90DCAE7}";
  29. // No public place for this now, real def is in gina\gpext\appmgmt\cs.idl.
  30. extern const IID IID_IClassAdmin = {0x00000191,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
  31. // RSOP flavors:
  32. extern const CLSID CLSID_RSOP_Snapin = {
  33. 0x1bc972d6,
  34. 0x555c,
  35. 0x4ff7,
  36. {0xbe, 0x2c, 0xc5, 0x84, 0x02, 0x1a, 0x0a, 0x6a}};
  37. extern const wchar_t * szCLSID_RSOP_Snapin = L"{1BC972D6-555C-4FF7-BE2C-C584021A0A6A}";
  38. extern const CLSID CLSID_RSOP_MachineSnapin = {
  39. 0x7e45546f,
  40. 0x6d52,
  41. 0x4d10,
  42. {0xb7, 0x02, 0x9c, 0x2e, 0x67, 0x23, 0x2e, 0x62}};
  43. extern const wchar_t * szCLSID_RSOP_MachineSnapin = L"{7E45546F-6D52-4D10-B702-9C2E67232E62}";
  44. #include "safereg.hxx"
  45. #define BREAK_ON_FAIL_HRESULT(hr) if (FAILED(hr)) break
  46. #define PSBUFFER_STR L"AppManagementBuffer"
  47. #define THREADING_STR L"Apartment"
  48. HRESULT
  49. RegisterInterface(
  50. CSafeReg *pshkInterface,
  51. LPWSTR wszInterfaceGUID,
  52. LPWSTR wszInterfaceName,
  53. LPWSTR wszNumMethods,
  54. LPWSTR wszProxyCLSID);
  55. CComModule _Module;
  56. BEGIN_OBJECT_MAP(ObjectMap)
  57. OBJECT_ENTRY(CLSID_Snapin, CUserComponentDataImpl)
  58. OBJECT_ENTRY(CLSID_MachineSnapin, CMachineComponentDataImpl)
  59. OBJECT_ENTRY(CLSID_RSOP_Snapin, CRSOPUserComponentDataImpl)
  60. OBJECT_ENTRY(CLSID_RSOP_MachineSnapin, CRSOPMachineComponentDataImpl)
  61. END_OBJECT_MAP()
  62. CLSID CLSID_Temp;
  63. #ifdef _DEBUG
  64. #define new DEBUG_NEW
  65. #undef THIS_FILE
  66. static char THIS_FILE[] = __FILE__;
  67. #endif
  68. class CSnapinApp : public CWinApp
  69. {
  70. public:
  71. virtual BOOL InitInstance();
  72. virtual int ExitInstance();
  73. };
  74. CSnapinApp theApp;
  75. HINSTANCE ghInstance;
  76. BOOL CSnapinApp::InitInstance()
  77. {
  78. ghInstance = m_hInstance;
  79. _Module.Init(ObjectMap, m_hInstance);
  80. // CoGetMalloc(1, &g_pIMalloc);
  81. CsSetOptions( CsOption_AdminTool );
  82. InitDebugSupport();
  83. // Add theme'ing support
  84. BOOL bInitialized = SHFusionInitializeFromModuleID (m_hInstance, 2);
  85. if ( bInitialized )
  86. {
  87. return bInitialized = CWinApp::InitInstance();
  88. }
  89. return bInitialized;
  90. }
  91. int CSnapinApp::ExitInstance()
  92. {
  93. _Module.Term();
  94. DEBUG_VERIFY_INSTANCE_COUNT(CResultPane);
  95. DEBUG_VERIFY_INSTANCE_COUNT(CScopePane);
  96. // Cleanup required by fusion support
  97. SHFusionUninitialize();
  98. // g_pIMalloc->Release();
  99. return CWinApp::ExitInstance();
  100. }
  101. /////////////////////////////////////////////////////////////////////////////
  102. // Used to determine whether the DLL can be unloaded by OLE
  103. STDAPI DllCanUnloadNow(void)
  104. {
  105. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  106. return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
  107. }
  108. /////////////////////////////////////////////////////////////////////////////
  109. // Returns a class factory to create an object of the requested type
  110. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  111. {
  112. return _Module.GetClassObject(rclsid, riid, ppv);
  113. }
  114. const wchar_t * szUser_Namespace = L"{59849DF9-A256-11D1-A760-00C04FB9603F}";
  115. const wchar_t * szMachine_Namespace = L"{4D53F093-A260-11D1-A760-00C04FB9603F}";
  116. const wchar_t * szMachineAppName = L"Software Installation (Computers)";
  117. const wchar_t * szUserAppName = L"Software Installation (Users)";
  118. const wchar_t * szUser_RSOP_Namespace = L"{9D5EB218-8EA3-4EE9-B120-52FC68C8D128}";
  119. const wchar_t * szMachine_RSOP_Namespace = L"{DFA38559-8B35-42EF-8B00-E8F6CBF99BC0}";
  120. const wchar_t * szUserAppNameIndirect = L"@appmgr.dll,-50";
  121. const wchar_t * szMachineAppNameIndirect = L"@appmgr.dll,-51";
  122. /////////////////////////////////////////////////////////////////////////////
  123. // DllRegisterServer - Adds entries to the system registry
  124. STDAPI DllRegisterServer(void)
  125. {
  126. CSafeReg shk;
  127. CSafeReg shkCLSID;
  128. CSafeReg shkServer;
  129. CSafeReg shkTemp;
  130. HRESULT hr = S_OK;
  131. do
  132. {
  133. CLSID_Temp = CLSID_Snapin;
  134. hr = _Module.RegisterServer(FALSE);
  135. BREAK_ON_FAIL_HRESULT(hr);
  136. // register extension
  137. hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns", KEY_WRITE);
  138. BREAK_ON_FAIL_HRESULT(hr);
  139. hr = shkCLSID.Create(szCLSID_Snapin, &shk);
  140. BREAK_ON_FAIL_HRESULT(hr);
  141. hr = shk.SetValue(L"NameString",
  142. REG_SZ,
  143. (CONST BYTE *) szUserAppName,
  144. sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
  145. hr = shk.SetValue(L"NameStringIndirect",
  146. REG_SZ,
  147. (CONST BYTE *) szUserAppNameIndirect,
  148. sizeof(WCHAR) * (lstrlen(szUserAppNameIndirect)+ 1));
  149. hr = shk.Create(L"NodeTypes", &shkTemp);
  150. BREAK_ON_FAIL_HRESULT(hr);
  151. hr = shkTemp.Create(szUser_Namespace, &shkServer);
  152. BREAK_ON_FAIL_HRESULT(hr);
  153. shkServer.Close();
  154. shkTemp.Close();
  155. shk.Close();
  156. hr = shkCLSID.Create(szCLSID_MachineSnapin, &shk);
  157. BREAK_ON_FAIL_HRESULT(hr);
  158. hr = shk.SetValue(L"NameString",
  159. REG_SZ,
  160. (CONST BYTE *) szMachineAppName,
  161. sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
  162. hr = shk.SetValue(L"NameStringIndirect",
  163. REG_SZ,
  164. (CONST BYTE *) szMachineAppNameIndirect,
  165. sizeof(WCHAR) * (lstrlen(szMachineAppNameIndirect)+ 1));
  166. hr = shk.Create(L"NodeTypes", &shkTemp);
  167. BREAK_ON_FAIL_HRESULT(hr);
  168. hr = shkTemp.Create(szMachine_Namespace, &shkServer);
  169. BREAK_ON_FAIL_HRESULT(hr);
  170. shkServer.Close();
  171. shkTemp.Close();
  172. shk.Close();
  173. shkCLSID.Close();
  174. hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes", KEY_WRITE);
  175. BREAK_ON_FAIL_HRESULT(hr);
  176. hr = shkCLSID.Create(szUser_Namespace, &shk);
  177. BREAK_ON_FAIL_HRESULT(hr);
  178. shk.Close();
  179. hr = shkCLSID.Create(szMachine_Namespace, &shk);
  180. BREAK_ON_FAIL_HRESULT(hr);
  181. shk.Close();
  182. WCHAR szGUID[50];
  183. StringFromGUID2 (NODEID_UserSWSettings, szGUID, 50);
  184. hr = shkCLSID.Create(szGUID, &shk);
  185. BREAK_ON_FAIL_HRESULT(hr);
  186. hr = shk.Create(L"Extensions", &shkServer);
  187. BREAK_ON_FAIL_HRESULT(hr);
  188. hr = shkServer.Create(L"NameSpace", &shkTemp);
  189. BREAK_ON_FAIL_HRESULT(hr);
  190. hr = shkTemp.SetValue(szCLSID_Snapin,
  191. REG_SZ,
  192. (CONST BYTE *) szUserAppName,
  193. sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
  194. shkTemp.Close();
  195. shkServer.Close();
  196. shk.Close();
  197. StringFromGUID2 (NODEID_MachineSWSettings, szGUID, 50);
  198. hr = shkCLSID.Create(szGUID, &shk);
  199. BREAK_ON_FAIL_HRESULT(hr);
  200. hr = shk.Create(L"Extensions", &shkServer);
  201. BREAK_ON_FAIL_HRESULT(hr);
  202. hr = shkServer.Create(L"NameSpace", &shkTemp);
  203. BREAK_ON_FAIL_HRESULT(hr);
  204. hr = shkTemp.SetValue(szCLSID_MachineSnapin,
  205. REG_SZ,
  206. (CONST BYTE *) szMachineAppName,
  207. sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
  208. shkTemp.Close();
  209. shkServer.Close();
  210. shk.Close();
  211. shkCLSID.Close();
  212. //
  213. // RSOP versions
  214. //
  215. CLSID_Temp = CLSID_RSOP_Snapin;
  216. hr = _Module.RegisterServer(FALSE);
  217. BREAK_ON_FAIL_HRESULT(hr);
  218. // register extension
  219. hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns", KEY_WRITE);
  220. BREAK_ON_FAIL_HRESULT(hr);
  221. hr = shkCLSID.Create(szCLSID_RSOP_Snapin, &shk);
  222. BREAK_ON_FAIL_HRESULT(hr);
  223. hr = shk.SetValue(L"NameString",
  224. REG_SZ,
  225. (CONST BYTE *) szUserAppName,
  226. sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
  227. hr = shk.SetValue(L"NameStringIndirect",
  228. REG_SZ,
  229. (CONST BYTE *) szUserAppNameIndirect,
  230. sizeof(WCHAR) * (lstrlen(szUserAppNameIndirect)+ 1));
  231. hr = shk.Create(L"NodeTypes", &shkTemp);
  232. BREAK_ON_FAIL_HRESULT(hr);
  233. hr = shkTemp.Create(szUser_RSOP_Namespace, &shkServer);
  234. BREAK_ON_FAIL_HRESULT(hr);
  235. shkServer.Close();
  236. shkTemp.Close();
  237. shk.Close();
  238. hr = shkCLSID.Create(szCLSID_RSOP_MachineSnapin, &shk);
  239. BREAK_ON_FAIL_HRESULT(hr);
  240. hr = shk.SetValue(L"NameString",
  241. REG_SZ,
  242. (CONST BYTE *) szMachineAppName,
  243. sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
  244. hr = shk.SetValue(L"NameStringIndirect",
  245. REG_SZ,
  246. (CONST BYTE *) szMachineAppNameIndirect,
  247. sizeof(WCHAR) * (lstrlen(szMachineAppNameIndirect)+ 1));
  248. hr = shk.Create(L"NodeTypes", &shkTemp);
  249. BREAK_ON_FAIL_HRESULT(hr);
  250. hr = shkTemp.Create(szMachine_RSOP_Namespace, &shkServer);
  251. BREAK_ON_FAIL_HRESULT(hr);
  252. shkServer.Close();
  253. shkTemp.Close();
  254. shk.Close();
  255. shkCLSID.Close();
  256. hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes", KEY_WRITE);
  257. BREAK_ON_FAIL_HRESULT(hr);
  258. hr = shkCLSID.Create(szUser_RSOP_Namespace, &shk);
  259. BREAK_ON_FAIL_HRESULT(hr);
  260. shk.Close();
  261. hr = shkCLSID.Create(szMachine_RSOP_Namespace, &shk);
  262. BREAK_ON_FAIL_HRESULT(hr);
  263. shk.Close();
  264. StringFromGUID2 (NODEID_RSOPUserSWSettings, szGUID, 50);
  265. hr = shkCLSID.Create(szGUID, &shk);
  266. BREAK_ON_FAIL_HRESULT(hr);
  267. hr = shk.Create(L"Extensions", &shkServer);
  268. BREAK_ON_FAIL_HRESULT(hr);
  269. hr = shkServer.Create(L"NameSpace", &shkTemp);
  270. BREAK_ON_FAIL_HRESULT(hr);
  271. hr = shkTemp.SetValue(szCLSID_RSOP_Snapin,
  272. REG_SZ,
  273. (CONST BYTE *) szUserAppName,
  274. sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
  275. shkTemp.Close();
  276. shkServer.Close();
  277. shk.Close();
  278. StringFromGUID2 (NODEID_RSOPMachineSWSettings, szGUID, 50);
  279. hr = shkCLSID.Create(szGUID, &shk);
  280. BREAK_ON_FAIL_HRESULT(hr);
  281. hr = shk.Create(L"Extensions", &shkServer);
  282. BREAK_ON_FAIL_HRESULT(hr);
  283. hr = shkServer.Create(L"NameSpace", &shkTemp);
  284. BREAK_ON_FAIL_HRESULT(hr);
  285. hr = shkTemp.SetValue(szCLSID_RSOP_MachineSnapin,
  286. REG_SZ,
  287. (CONST BYTE *) szMachineAppName,
  288. sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
  289. shkTemp.Close();
  290. shkServer.Close();
  291. shk.Close();
  292. shkCLSID.Close();
  293. hr = shkCLSID.Open(HKEY_CLASSES_ROOT, L"CLSID", KEY_WRITE);
  294. BREAK_ON_FAIL_HRESULT(hr);
  295. } while (0);
  296. return hr;
  297. }
  298. /////////////////////////////////////////////////////////////////////////////
  299. // DllUnregisterServer - Removes entries from the system registry
  300. STDAPI DllUnregisterServer(void)
  301. {
  302. CLSID_Temp = CLSID_Snapin;
  303. _Module.UnregisterServer();
  304. HKEY hkey;
  305. CString sz;
  306. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
  307. if (hkey)
  308. {
  309. RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_Snapin));
  310. RegCloseKey(hkey);
  311. }
  312. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
  313. if (hkey)
  314. {
  315. RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szUser_Namespace));
  316. RegCloseKey(hkey);
  317. }
  318. WCHAR szGUID[50];
  319. sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
  320. StringFromGUID2 (NODEID_UserSWSettings, szGUID, 50);
  321. sz += szGUID;
  322. sz += L"\\Extensions\\NameSpace";
  323. RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
  324. if (hkey)
  325. {
  326. RegDeleteValue(hkey, szCLSID_Snapin);
  327. RegCloseKey(hkey);
  328. }
  329. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
  330. if (hkey)
  331. {
  332. RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_MachineSnapin));
  333. RegCloseKey(hkey);
  334. }
  335. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
  336. if (hkey)
  337. {
  338. RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szMachine_Namespace));
  339. RegCloseKey(hkey);
  340. }
  341. sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
  342. StringFromGUID2 (NODEID_MachineSWSettings, szGUID, 50);
  343. sz += szGUID;
  344. sz += L"\\Extensions\\NameSpace";
  345. RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
  346. if (hkey)
  347. {
  348. RegDeleteValue(hkey, szCLSID_MachineSnapin);
  349. RegCloseKey(hkey);
  350. }
  351. //
  352. // RSOP versions
  353. //
  354. CLSID_Temp = CLSID_RSOP_Snapin;
  355. _Module.UnregisterServer();
  356. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
  357. if (hkey)
  358. {
  359. RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_RSOP_Snapin));
  360. RegCloseKey(hkey);
  361. }
  362. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
  363. if (hkey)
  364. {
  365. RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szUser_RSOP_Namespace));
  366. RegCloseKey(hkey);
  367. }
  368. sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
  369. StringFromGUID2 (NODEID_RSOPUserSWSettings, szGUID, 50);
  370. sz += szGUID;
  371. sz += L"\\Extensions\\NameSpace";
  372. RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
  373. if (hkey)
  374. {
  375. RegDeleteValue(hkey, szCLSID_Snapin);
  376. RegCloseKey(hkey);
  377. }
  378. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
  379. if (hkey)
  380. {
  381. RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_RSOP_MachineSnapin));
  382. RegCloseKey(hkey);
  383. }
  384. RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
  385. if (hkey)
  386. {
  387. RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szMachine_Namespace));
  388. RegCloseKey(hkey);
  389. }
  390. sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
  391. StringFromGUID2 (NODEID_RSOPMachineSWSettings, szGUID, 50);
  392. sz += szGUID;
  393. sz += L"\\Extensions\\NameSpace";
  394. RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
  395. if (hkey)
  396. {
  397. RegDeleteValue(hkey, szCLSID_RSOP_MachineSnapin);
  398. RegCloseKey(hkey);
  399. }
  400. return S_OK;
  401. }
  402. //+--------------------------------------------------------------------------
  403. //
  404. // Function: RegisterInterface
  405. //
  406. // Synopsis: Add the registry entries required for an interface.
  407. //
  408. // Arguments: [pshkInterface] - handle to CLSID\Interface key
  409. // [wszInterfaceGUID] - GUID of interface to add
  410. // [wszInterfaceName] - human-readable name of interface
  411. // [wszNumMethods] - number of methods (including inherited)
  412. // [wszProxyCLSID] - GUID of dll containing proxy/stubs
  413. //
  414. // Returns: HRESULT
  415. //
  416. // History: 3-31-1997 DavidMun Created
  417. // 5-09-1997 SteveBl Modified for use with AppMgr
  418. //
  419. //---------------------------------------------------------------------------
  420. HRESULT
  421. RegisterInterface(
  422. CSafeReg *pshkInterface,
  423. LPWSTR wszInterfaceGUID,
  424. LPWSTR wszInterfaceName,
  425. LPWSTR wszNumMethods,
  426. LPWSTR wszProxyCLSID)
  427. {
  428. HRESULT hr = S_OK;
  429. CSafeReg shkIID;
  430. CSafeReg shkNumMethods;
  431. CSafeReg shkProxy;
  432. do
  433. {
  434. hr = pshkInterface->Create(wszInterfaceGUID, &shkIID);
  435. BREAK_ON_FAIL_HRESULT(hr);
  436. hr = shkIID.SetValue(NULL,
  437. REG_SZ,
  438. (CONST BYTE *) wszInterfaceName,
  439. sizeof(WCHAR) * (lstrlen(wszInterfaceName) + 1));
  440. BREAK_ON_FAIL_HRESULT(hr);
  441. hr = shkIID.Create(L"NumMethods", &shkNumMethods);
  442. BREAK_ON_FAIL_HRESULT(hr);
  443. hr = shkNumMethods.SetValue(NULL,
  444. REG_SZ,
  445. (CONST BYTE *)wszNumMethods,
  446. sizeof(WCHAR) * (lstrlen(wszNumMethods) + 1));
  447. BREAK_ON_FAIL_HRESULT(hr);
  448. hr = shkIID.Create(L"ProxyStubClsid32", &shkProxy);
  449. BREAK_ON_FAIL_HRESULT(hr);
  450. hr = shkProxy.SetValue(NULL,
  451. REG_SZ,
  452. (CONST BYTE *)wszProxyCLSID,
  453. sizeof(WCHAR) * (lstrlen(wszProxyCLSID) + 1));
  454. BREAK_ON_FAIL_HRESULT(hr);
  455. } while (0);
  456. return hr;
  457. }