Source code of Windows XP (NT5)
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.

666 lines
17 KiB

  1. #include "SDKInternal.h"
  2. #include <atlbase.h>
  3. #if(_WIN32_WINNT < 0x0500)
  4. extern "C"
  5. WINUSERAPI
  6. BOOL
  7. WINAPI
  8. AllowSetForegroundWindow(
  9. DWORD dwProcessId);
  10. #define ASFW_ANY ((DWORD)-1)
  11. #endif
  12. /* [local] */ HRESULT STDMETHODCALLTYPE INmObject_CallDialog_Proxy(
  13. INmObject __RPC_FAR * This,
  14. /* [in] */ long hwnd,
  15. /* [in] */ int options)
  16. {
  17. AllowSetForegroundWindow(ASFW_ANY);
  18. return INmObject_RemoteCallDialog_Proxy(This, hwnd, options);
  19. }
  20. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmObject_CallDialog_Stub(
  21. INmObject __RPC_FAR * This,
  22. /* [in] */ long hwnd,
  23. /* [in] */ int options)
  24. {
  25. return This->CallDialog(hwnd, options);
  26. }
  27. /* [local] */ HRESULT STDMETHODCALLTYPE INmObject_ShowLocal_Proxy(
  28. INmObject __RPC_FAR * This,
  29. /* [in] */ NM_APPID appId)
  30. {
  31. AllowSetForegroundWindow(ASFW_ANY);
  32. return INmObject_RemoteShowLocal_Proxy(This, appId);
  33. }
  34. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmObject_ShowLocal_Stub(
  35. INmObject __RPC_FAR * This,
  36. /* [in] */ NM_APPID appId)
  37. {
  38. return This->ShowLocal(appId);
  39. }
  40. /* [local] */ HRESULT STDMETHODCALLTYPE INmManager_Initialize_Proxy(
  41. INmManager __RPC_FAR * This,
  42. /* [out][in] */ ULONG __RPC_FAR *puOptions,
  43. /* [out][in] */ ULONG __RPC_FAR *puchCaps)
  44. {
  45. ULONG uOptions = puOptions ? *puOptions : NM_INIT_NORMAL;
  46. ULONG uchCaps = puchCaps ? *puchCaps : NMCH_ALL;
  47. HRESULT hr = INmManager_RemoteInitialize_Proxy(This, &uOptions, &uchCaps);
  48. if(puOptions)
  49. {
  50. *puOptions = uOptions;
  51. }
  52. if(puchCaps)
  53. {
  54. *puchCaps = uchCaps;
  55. }
  56. return hr;
  57. }
  58. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmManager_Initialize_Stub(
  59. INmManager __RPC_FAR * This,
  60. /* [out][in] */ ULONG __RPC_FAR *puOptions,
  61. /* [out][in] */ ULONG __RPC_FAR *puchCaps)
  62. {
  63. return This->Initialize(puOptions, puchCaps);
  64. }
  65. /* [local] */ HRESULT STDMETHODCALLTYPE INmManager_CreateConference_Proxy(
  66. INmManager __RPC_FAR * This,
  67. /* [out] */ INmConference __RPC_FAR *__RPC_FAR *ppConference,
  68. /* [in] */ BSTR bstrName,
  69. /* [in] */ BSTR bstrPassword,
  70. /* [in] */ ULONG uchCaps)
  71. {
  72. INmConference* pConf = ppConference ? *ppConference : NULL;
  73. // These may be OLECHARs and not BSTR
  74. CComBSTR _bstrName = bstrName;
  75. CComBSTR _bstrPassword = bstrPassword;
  76. HRESULT hr = INmManager_RemoteCreateConference_Proxy(This, &pConf, _bstrName, _bstrPassword, uchCaps);
  77. if(ppConference)
  78. {
  79. *ppConference = pConf;
  80. }
  81. else if(SUCCEEDED(hr))
  82. {
  83. // Since the client does not want this pointer, we discard it
  84. pConf->Release();
  85. }
  86. return hr;
  87. }
  88. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmManager_CreateConference_Stub(
  89. INmManager __RPC_FAR * This,
  90. /* [out] */ INmConference __RPC_FAR *__RPC_FAR *ppConference,
  91. /* [in] */ BSTR bstrName,
  92. /* [in] */ BSTR bstrPassword,
  93. /* [in] */ ULONG uchCaps)
  94. {
  95. return This->CreateConference(ppConference, bstrName, bstrPassword, uchCaps);
  96. }
  97. /* [local] */ HRESULT STDMETHODCALLTYPE INmManager_CreateCall_Proxy(
  98. INmManager __RPC_FAR * This,
  99. /* [out] */ INmCall __RPC_FAR *__RPC_FAR *ppCall,
  100. /* [in] */ NM_CALL_TYPE callType,
  101. /* [in] */ NM_ADDR_TYPE addrType,
  102. /* [in] */ BSTR bstrAddr,
  103. /* [in] */ INmConference __RPC_FAR *pConference)
  104. {
  105. INmCall* pCall = NULL;
  106. // These may be OLECHARs and not BSTR
  107. CComBSTR _bstrAddr = bstrAddr;
  108. HRESULT hr = INmManager_RemoteCreateCall_Proxy(This, &pCall, callType, addrType, _bstrAddr, pConference);
  109. if(ppCall)
  110. {
  111. *ppCall = pCall;
  112. }
  113. else if(SUCCEEDED(hr))
  114. {
  115. // Since the client does not want this pointer, we discard it
  116. pCall->Release();
  117. }
  118. return hr;
  119. }
  120. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmManager_CreateCall_Stub(
  121. INmManager __RPC_FAR * This,
  122. /* [out] */ INmCall __RPC_FAR *__RPC_FAR *ppCall,
  123. /* [in] */ NM_CALL_TYPE callType,
  124. /* [in] */ NM_ADDR_TYPE addrType,
  125. /* [in] */ BSTR bstrAddr,
  126. /* [in] */ INmConference __RPC_FAR *pConference)
  127. {
  128. return This->CreateCall(ppCall, callType, addrType, bstrAddr, pConference);
  129. }
  130. /* [local] */ HRESULT STDMETHODCALLTYPE INmManager_CallConference_Proxy(
  131. INmManager __RPC_FAR * This,
  132. /* [out] */ INmCall __RPC_FAR *__RPC_FAR *ppCall,
  133. /* [in] */ NM_CALL_TYPE callType,
  134. /* [in] */ NM_ADDR_TYPE addrType,
  135. /* [in] */ BSTR bstrAddr,
  136. /* [in] */ BSTR bstrName,
  137. /* [in] */ BSTR bstrPassword)
  138. {
  139. INmCall* pCall = ppCall ? *ppCall : NULL;
  140. CComBSTR _bstrAddr = bstrAddr;
  141. CComBSTR _bstrName = bstrName;
  142. CComBSTR _bstrPassword = bstrPassword;
  143. HRESULT hr = INmManager_RemoteCallConference_Proxy(This, &pCall, callType, addrType, _bstrAddr, _bstrName, _bstrPassword);
  144. if(ppCall)
  145. {
  146. *ppCall = pCall;
  147. }
  148. else if(SUCCEEDED(hr))
  149. {
  150. // Since the client does not want this pointer, we discard it
  151. pCall->Release();
  152. }
  153. return hr;
  154. }
  155. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmManager_CallConference_Stub(
  156. INmManager __RPC_FAR * This,
  157. /* [out] */ INmCall __RPC_FAR *__RPC_FAR *ppCall,
  158. /* [in] */ NM_CALL_TYPE callType,
  159. /* [in] */ NM_ADDR_TYPE addrType,
  160. /* [in] */ BSTR bstrAddr,
  161. /* [in] */ BSTR bstrName,
  162. /* [in] */ BSTR bstrPassword)
  163. {
  164. return This->CallConference(ppCall, callType, addrType, bstrAddr, bstrName, bstrPassword);
  165. }
  166. /* [local] */ HRESULT STDMETHODCALLTYPE INmConference_CreateDataChannel_Proxy(
  167. INmConference __RPC_FAR * This,
  168. /* [out] */ INmChannelData __RPC_FAR *__RPC_FAR *ppChannel,
  169. /* [in] */ REFGUID rguid)
  170. {
  171. INmChannelData* pChan = ppChannel ? *ppChannel : NULL;
  172. HRESULT hr = INmConference_RemoteCreateDataChannel_Proxy(This, &pChan, rguid);
  173. if(ppChannel)
  174. {
  175. *ppChannel = pChan;
  176. }
  177. else if(SUCCEEDED(hr))
  178. {
  179. // Since the client does not want this pointer, we discard it
  180. pChan->Release();
  181. }
  182. return hr;
  183. }
  184. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmConference_CreateDataChannel_Stub(
  185. INmConference __RPC_FAR * This,
  186. /* [out] */ INmChannelData __RPC_FAR *__RPC_FAR *ppChannel,
  187. /* [in] */ REFGUID rguid)
  188. {
  189. return This->CreateDataChannel(ppChannel, rguid);
  190. }
  191. /* [local] */ HRESULT STDMETHODCALLTYPE INmChannelFt_SendFile_Proxy(
  192. INmChannelFt __RPC_FAR * This,
  193. /* [out] */ INmFt __RPC_FAR *__RPC_FAR *ppFt,
  194. /* [in] */ INmMember __RPC_FAR *pMember,
  195. /* [in] */ BSTR bstrFile,
  196. /* [in] */ ULONG uOptions)
  197. {
  198. INmFt* pFt = ppFt ? *ppFt : NULL;
  199. CComBSTR _bstrFile = bstrFile;
  200. HRESULT hr = INmChannelFt_RemoteSendFile_Proxy(This, &pFt, pMember, _bstrFile, uOptions);
  201. if(ppFt)
  202. {
  203. *ppFt = pFt;
  204. }
  205. else if(SUCCEEDED(hr))
  206. {
  207. // Since the client does not want this pointer, we discard it
  208. pFt->Release();
  209. }
  210. return hr;
  211. }
  212. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmChannelFt_SendFile_Stub(
  213. INmChannelFt __RPC_FAR * This,
  214. /* [out] */ INmFt __RPC_FAR *__RPC_FAR *ppFt,
  215. /* [in] */ INmMember __RPC_FAR *pMember,
  216. /* [in] */ BSTR bstrFile,
  217. /* [in] */ ULONG uOptions)
  218. {
  219. return This->SendFile(ppFt, pMember, bstrFile, uOptions);
  220. }
  221. /* [local] */ HRESULT STDMETHODCALLTYPE INmChannelFt_SetReceiveFileDir_Proxy(
  222. INmChannelFt __RPC_FAR * This,
  223. /* [in] */ BSTR bstrDir)
  224. {
  225. CComBSTR _bstrDir = bstrDir;
  226. return INmChannelFt_RemoteSetReceiveFileDir_Proxy(This, _bstrDir);
  227. }
  228. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmChannelFt_SetReceiveFileDir_Stub(
  229. INmChannelFt __RPC_FAR * This,
  230. /* [in] */ BSTR bstrDir)
  231. {
  232. return This->SetReceiveFileDir(bstrDir);
  233. }
  234. /* [local] */ HRESULT STDMETHODCALLTYPE IEnumNmConference_Next_Proxy(
  235. IEnumNmConference __RPC_FAR * This,
  236. /* [in] */ ULONG cConference,
  237. /* [out] */ INmConference __RPC_FAR *__RPC_FAR *rgpConference,
  238. /* [out] */ ULONG __RPC_FAR *pcFetched)
  239. {
  240. HRESULT hr = S_OK;
  241. // The user can pass NULL for rpgConference and set cConference to 0
  242. // to get the number of items, but they have to BOTH be set!
  243. if ((0 == cConference) && (NULL == rgpConference) && (NULL != pcFetched))
  244. {
  245. INmConference *pConference = NULL;
  246. cConference = 1;
  247. // Return the number of remaining elements
  248. ULONG ulItems = *pcFetched = 0;
  249. hr = IEnumNmConference_RemoteNext_Proxy(This, cConference, &pConference, pcFetched, &ulItems, TRUE);
  250. *pcFetched = ulItems;
  251. return hr;
  252. }
  253. if ((NULL == rgpConference) || ((NULL == pcFetched) && (cConference != 1)))
  254. return E_POINTER;
  255. ULONG cFetched = pcFetched ? *pcFetched : 0;
  256. // This parameter is only used when we have to determine the number of elements
  257. ULONG ulUnused;
  258. hr = IEnumNmConference_RemoteNext_Proxy(This, cConference, rgpConference, &cFetched, &ulUnused, FALSE);
  259. if(pcFetched)
  260. {
  261. *pcFetched = cFetched;
  262. }
  263. return hr;
  264. }
  265. /* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumNmConference_Next_Stub(
  266. IEnumNmConference __RPC_FAR * This,
  267. /* [in] */ ULONG cConference,
  268. /* [length_is][size_is][out] */ INmConference __RPC_FAR *__RPC_FAR *rgpConference,
  269. /* [out] */ ULONG __RPC_FAR *pcFetched,
  270. /* [out] */ ULONG __RPC_FAR *pcItems,
  271. /* [in] */ BOOL bGetNumberRemaining)
  272. {
  273. if(bGetNumberRemaining)
  274. {
  275. HRESULT hr = This->Next(0, NULL, pcFetched);
  276. // Store the numebr of items
  277. *pcItems = *pcFetched;
  278. // This is so the marshaller does not think that *rgpConference has valid info
  279. *pcFetched = 0;
  280. return hr;
  281. }
  282. return This->Next(cConference, rgpConference, pcFetched);
  283. }
  284. /* [local] */ HRESULT STDMETHODCALLTYPE IEnumNmMember_Next_Proxy(
  285. IEnumNmMember __RPC_FAR * This,
  286. /* [in] */ ULONG cMember,
  287. /* [out] */ INmMember __RPC_FAR *__RPC_FAR *rgpMember,
  288. /* [out] */ ULONG __RPC_FAR *pcFetched)
  289. {
  290. HRESULT hr = S_OK;
  291. // The user can pass NULL for rpgMember and set cMember to 0
  292. // to get the number of items, but they have to BOTH be set!
  293. if ((0 == cMember) && (NULL == rgpMember) && (NULL != pcFetched))
  294. {
  295. INmMember *pMember = NULL;
  296. cMember = 1;
  297. // Return the number of remaining elements
  298. ULONG ulItems = *pcFetched = 0;
  299. hr = IEnumNmMember_RemoteNext_Proxy(This, cMember, &pMember, pcFetched, &ulItems, TRUE);
  300. *pcFetched = ulItems;
  301. return hr;
  302. }
  303. if ((NULL == rgpMember) || ((NULL == pcFetched) && (cMember != 1)))
  304. return E_POINTER;
  305. ULONG cFetched = pcFetched ? *pcFetched : 0;
  306. // This parameter is only used when we have to determine the number of elements
  307. ULONG ulUnused;
  308. hr = IEnumNmMember_RemoteNext_Proxy(This, cMember, rgpMember, &cFetched, &ulUnused, FALSE);
  309. if(pcFetched)
  310. {
  311. *pcFetched = cFetched;
  312. }
  313. return hr;
  314. }
  315. /* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumNmMember_Next_Stub(
  316. IEnumNmMember __RPC_FAR * This,
  317. /* [in] */ ULONG cMember,
  318. /* [length_is][size_is][out] */ INmMember __RPC_FAR *__RPC_FAR *rgpMember,
  319. /* [out] */ ULONG __RPC_FAR *pcFetched,
  320. /* [out] */ ULONG __RPC_FAR *pcItems,
  321. /* [in] */ BOOL bGetNumberRemaining)
  322. {
  323. if(bGetNumberRemaining)
  324. {
  325. HRESULT hr = This->Next(0, NULL, pcFetched);
  326. // Store the numebr of items
  327. *pcItems = *pcFetched;
  328. // This is so the marshaller does not think that *rgpMember has valid info
  329. *pcFetched = 0;
  330. return hr;
  331. }
  332. return This->Next(cMember, rgpMember, pcFetched);
  333. }
  334. /* [local] */ HRESULT STDMETHODCALLTYPE IEnumNmChannel_Next_Proxy(
  335. IEnumNmChannel __RPC_FAR * This,
  336. /* [in] */ ULONG cChannel,
  337. /* [out] */ INmChannel __RPC_FAR *__RPC_FAR *rgpChannel,
  338. /* [out] */ ULONG __RPC_FAR *pcFetched)
  339. {
  340. HRESULT hr = S_OK;
  341. // The user can pass NULL for rpgChannel and set cChannel to 0
  342. // to get the number of items, but they have to BOTH be set!
  343. if ((0 == cChannel) && (NULL == rgpChannel) && (NULL != pcFetched))
  344. {
  345. INmChannel *pChannel = NULL;
  346. cChannel = 1;
  347. // Return the number of remaining elements
  348. ULONG ulItems = *pcFetched = 0;
  349. hr = IEnumNmChannel_RemoteNext_Proxy(This, cChannel, &pChannel, pcFetched, &ulItems, TRUE);
  350. *pcFetched = ulItems;
  351. return hr;
  352. }
  353. if ((NULL == rgpChannel) || ((NULL == pcFetched) && (cChannel != 1)))
  354. return E_POINTER;
  355. ULONG cFetched = pcFetched ? *pcFetched : 0;
  356. // This parameter is only used when we have to determine the number of elements
  357. ULONG ulUnused;
  358. hr = IEnumNmChannel_RemoteNext_Proxy(This, cChannel, rgpChannel, &cFetched, &ulUnused, FALSE);
  359. if(pcFetched)
  360. {
  361. *pcFetched = cFetched;
  362. }
  363. return hr;
  364. }
  365. /* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumNmChannel_Next_Stub(
  366. IEnumNmChannel __RPC_FAR * This,
  367. /* [in] */ ULONG cChannel,
  368. /* [length_is][size_is][out] */ INmChannel __RPC_FAR *__RPC_FAR *rgpChannel,
  369. /* [out] */ ULONG __RPC_FAR *pcFetched,
  370. /* [out] */ ULONG __RPC_FAR *pcItems,
  371. /* [in] */ BOOL bGetNumberRemaining)
  372. {
  373. if(bGetNumberRemaining)
  374. {
  375. HRESULT hr = This->Next(0, NULL, pcFetched);
  376. // Store the numebr of items
  377. *pcItems = *pcFetched;
  378. // This is so the marshaller does not think that *rgpChannel has valid info
  379. *pcFetched = 0;
  380. return hr;
  381. }
  382. return This->Next(cChannel, rgpChannel, pcFetched);
  383. }
  384. /* [local] */ HRESULT STDMETHODCALLTYPE IEnumNmCall_Next_Proxy(
  385. IEnumNmCall __RPC_FAR * This,
  386. /* [in] */ ULONG cCall,
  387. /* [out] */ INmCall __RPC_FAR *__RPC_FAR *rgpCall,
  388. /* [out] */ ULONG __RPC_FAR *pcFetched)
  389. {
  390. HRESULT hr = S_OK;
  391. // The user can pass NULL for rpgCall and set cCall to 0
  392. // to get the number of items, but they have to BOTH be set!
  393. if ((0 == cCall) && (NULL == rgpCall) && (NULL != pcFetched))
  394. {
  395. INmCall *pCall = NULL;
  396. cCall = 1;
  397. // Return the number of remaining elements
  398. ULONG ulItems = *pcFetched = 0;
  399. hr = IEnumNmCall_RemoteNext_Proxy(This, cCall, &pCall, pcFetched, &ulItems, TRUE);
  400. *pcFetched = ulItems;
  401. return hr;
  402. }
  403. if ((NULL == rgpCall) || ((NULL == pcFetched) && (cCall != 1)))
  404. return E_POINTER;
  405. ULONG cFetched = pcFetched ? *pcFetched : 0;
  406. // This parameter is only used when we have to determine the number of elements
  407. ULONG ulUnused;
  408. hr = IEnumNmCall_RemoteNext_Proxy(This, cCall, rgpCall, &cFetched, &ulUnused, FALSE);
  409. if(pcFetched)
  410. {
  411. *pcFetched = cFetched;
  412. }
  413. return hr;
  414. }
  415. /* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumNmCall_Next_Stub(
  416. IEnumNmCall __RPC_FAR * This,
  417. /* [in] */ ULONG cCall,
  418. /* [length_is][size_is][out] */ INmCall __RPC_FAR *__RPC_FAR *rgpCall,
  419. /* [out] */ ULONG __RPC_FAR *pcFetched,
  420. /* [out] */ ULONG __RPC_FAR *pcItems,
  421. /* [in] */ BOOL bGetNumberRemaining)
  422. {
  423. if(bGetNumberRemaining)
  424. {
  425. HRESULT hr = This->Next(0, NULL, pcFetched);
  426. // Store the numebr of items
  427. *pcItems = *pcFetched;
  428. // This is so the marshaller does not think that *rgpCall has valid info
  429. *pcFetched = 0;
  430. return hr;
  431. }
  432. return This->Next(cCall, rgpCall, pcFetched);
  433. }
  434. /* [local] */ HRESULT STDMETHODCALLTYPE IEnumNmSharableApp_Next_Proxy(
  435. IEnumNmSharableApp __RPC_FAR * This,
  436. /* [in] */ ULONG cApp,
  437. /* [out] */ INmSharableApp __RPC_FAR *__RPC_FAR *rgpApp,
  438. /* [out] */ ULONG __RPC_FAR *pcFetched)
  439. {
  440. HRESULT hr = S_OK;
  441. // The user can pass NULL for rpgSharableApp and set cSharableApp to 0
  442. // to get the number of items, but they have to BOTH be set!
  443. if ((0 == cApp) && (NULL == rgpApp) && (NULL != pcFetched))
  444. {
  445. INmSharableApp *pSharableApp = NULL;
  446. cApp = 1;
  447. // Return the number of remaining elements
  448. ULONG ulItems = *pcFetched = 0;
  449. hr = IEnumNmSharableApp_RemoteNext_Proxy(This, cApp, &pSharableApp, pcFetched, &ulItems, TRUE);
  450. *pcFetched = ulItems;
  451. return hr;
  452. }
  453. if ((NULL == rgpApp) || ((NULL == pcFetched) && (cApp != 1)))
  454. return E_POINTER;
  455. ULONG cFetched = pcFetched ? *pcFetched : 0;
  456. // This parameter is only used when we have to determine the number of elements
  457. ULONG ulUnused;
  458. hr = IEnumNmSharableApp_RemoteNext_Proxy(This, cApp, rgpApp, &cFetched, &ulUnused, FALSE);
  459. if(pcFetched)
  460. {
  461. *pcFetched = cFetched;
  462. }
  463. return hr;
  464. }
  465. /* [call_as] */ HRESULT STDMETHODCALLTYPE IEnumNmSharableApp_Next_Stub(
  466. IEnumNmSharableApp __RPC_FAR * This,
  467. /* [in] */ ULONG cApp,
  468. /* [length_is][size_is][out] */ INmSharableApp __RPC_FAR *__RPC_FAR *rgpApp,
  469. /* [out] */ ULONG __RPC_FAR *pcFetched,
  470. /* [out] */ ULONG __RPC_FAR *pcItems,
  471. /* [in] */ BOOL bGetNumberRemaining)
  472. {
  473. if(bGetNumberRemaining)
  474. {
  475. HRESULT hr = This->Next(0, NULL, pcFetched);
  476. // Store the numebr of items
  477. *pcItems = *pcFetched;
  478. // This is so the marshaller does not think that *rgpApp has valid info
  479. *pcFetched = 0;
  480. return hr;
  481. }
  482. return This->Next(cApp, rgpApp, pcFetched);
  483. }
  484. typedef HRESULT (WINAPI *VERIFYUSERINFO)(HWND hwnd, NM_VUI options);
  485. /* [local] */ HRESULT STDMETHODCALLTYPE INmObject_VerifyUserInfo_Proxy(
  486. INmObject __RPC_FAR * This,
  487. /* [in] */ UINT_PTR hwnd,
  488. /* [in] */ NM_VUI options)
  489. {
  490. HRESULT hr = E_FAIL;
  491. HMODULE hMod = LoadLibrary("msconf.dll");
  492. if (NULL != hMod)
  493. {
  494. VERIFYUSERINFO pfnVUI = (VERIFYUSERINFO)GetProcAddress(hMod, "VerifyUserInfo");
  495. if (NULL != pfnVUI)
  496. {
  497. hr = pfnVUI((HWND)hwnd, options);
  498. }
  499. FreeLibrary(hMod);
  500. }
  501. return hr;
  502. }
  503. /* [call_as] */ HRESULT STDMETHODCALLTYPE INmObject_VerifyUserInfo_Stub(
  504. INmObject __RPC_FAR * This,
  505. /* [in] */ long hwnd,
  506. /* [in] */ NM_VUI options)
  507. {
  508. return This->VerifyUserInfo(hwnd, options);
  509. }