//+--------------------------------------------------------------------------- // // Function: HrGetINetCfg // // Purpose: Initialize COM, create and initialize INetCfg. // Obtain write lock if indicated. // // Arguments: // fGetWriteLock [in] whether to get write lock // ppnc [in] pointer to pointer to INetCfg object // // Returns: S_OK on success, otherwise an error code // // Notes: // HRESULT HrGetINetCfg(IN BOOL fGetWriteLock, INetCfg** ppnc) { HRESULT hr=S_OK; // Initialize the output parameters. *ppnc = NULL; // initialize COM hr = CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED ); if (SUCCEEDED(hr)) { // Create the object implementing INetCfg. // INetCfg* pnc; hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void**)&pnc); if (SUCCEEDED(hr)) { INetCfgLock * pncLock = NULL; if (fGetWriteLock) { // Get the locking interface hr = pnc->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write static const ULONG c_cmsTimeout = 15000; static const WCHAR c_szSampleNetcfgApp[] = L"Sample Netcfg Application (netcfg.exe)"; PWSTR szLockedBy; hr = pncLock->AcquireWriteLock(c_cmsTimeout, c_szSampleNetcfgApp, &szLockedBy); if (S_FALSE == hr) { hr = NETCFG_E_NO_WRITE_LOCK; } } } if (SUCCEEDED(hr)) { // Initialize the INetCfg object. // hr = pnc->Initialize(NULL); if (SUCCEEDED(hr)) { *ppnc = pnc; pnc->AddRef(); } else { // initialize failed, if obtained lock, release it if (pncLock) { pncLock->ReleaseWriteLock(); } } } ReleaseObj(pncLock); ReleaseObj(pnc); } if (FAILED(hr)) { CoUninitialize(); } } return hr; }
HRESULT HrGetINetCfg( IN BOOL fGetWriteLock, IN LPCTSTR lpszAppName, OUT INetCfg** ppnc, OUT LPTSTR *lpszLockedBy ) { INetCfg *pnc = NULL; INetCfgLock *pncLock = NULL; HRESULT hr = S_OK; // // Initialize the output parameters. // *ppnc = NULL; if (lpszLockedBy) { *lpszLockedBy = NULL; } // // Initialize COM // hr = CoInitialize(NULL); if (hr == S_OK) { // // Create the object implementing INetCfg. // hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void**)&pnc); if (hr == S_OK) { if (fGetWriteLock) { // // Get the locking reference // hr = pnc->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (hr == S_OK) { // // Attempt to lock the INetCfg for read/write // hr = pncLock->AcquireWriteLock(LOCK_TIME_OUT, lpszAppName, lpszLockedBy); if (hr == S_FALSE) { hr = NETCFG_E_NO_WRITE_LOCK; } } } if (hr == S_OK) { // // Initialize the INetCfg object. // hr = pnc->Initialize(NULL); if (hr == S_OK) { *ppnc = pnc; pnc->AddRef(); } else { // // Initialize failed, if obtained lock, release it // if (pncLock) { pncLock->ReleaseWriteLock(); } } } ReleaseRef(pncLock); ReleaseRef(pnc); } // // In case of error, uninitialize COM. // if (hr != S_OK) { CoUninitialize(); } } return hr; }