/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: sysprops.cpp * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 9/24/1999 * * DESCRIPTION: Implementation of property sheet helpers. Removed from miscutil, * because it required clients to link to comctl32.dll * *******************************************************************************/ #include "precomp.h" #pragma hdrstop #include // for property page functions #include "devlist.h" // for property page functions #include #include "wiapropui.h" DEFINE_GUID (CLSID_WiaPropHelp, 0x83bbcbf3,0xb28a,0x4919,0xa5, 0xaa, 0x73, 0x02, 0x74, 0x45, 0xd6, 0x72); DEFINE_GUID (IID_IWiaPropUI, /* 7eed2e9b-acda-11d2-8080-00805f6596d2 */ 0x7eed2e9b, 0xacda, 0x11d2, 0x80, 0x80, 0x00, 0x80, 0x5f, 0x65, 0x96, 0xd2 ); namespace WiaUiUtil { HRESULT SystemPropertySheet( HINSTANCE hInstance, HWND hwndParent, IWiaItem *pWiaItem, LPCTSTR pszCaption ) { CWaitCursor wc; CComPtr pWiaPropUI; HRESULT hr = CoCreateInstance (CLSID_WiaPropHelp, NULL, CLSCTX_INPROC_SERVER, IID_IWiaPropUI, reinterpret_cast(&pWiaPropUI)); if (SUCCEEDED(hr)) { PROPSHEETHEADER PropSheetHeader = {0}; PropSheetHeader.dwSize = sizeof(PropSheetHeader); PropSheetHeader.hwndParent = hwndParent; PropSheetHeader.hInstance = hInstance; PropSheetHeader.pszCaption = pszCaption; hr = pWiaPropUI->GetItemPropertyPages( pWiaItem, &PropSheetHeader ); if (SUCCEEDED(hr)) { if (PropSheetHeader.nPages) { // // Modal property sheets really don't need an apply button... // PropSheetHeader.dwFlags |= PSH_NOAPPLYNOW; INT_PTR nResult = PropertySheet(&PropSheetHeader); if (PropSheetHeader.phpage) { LocalFree(PropSheetHeader.phpage); } if (nResult < 0) { hr = E_FAIL; } else if (IDOK == nResult) { hr = S_OK; } else hr = S_FALSE; } else { hr = PROP_SHEET_ERROR_NO_PAGES; } } } return hr; } // Be careful calling this function. It is hideously slow... HRESULT GetDeviceInfoFromId( LPCWSTR pwszDeviceId, IWiaPropertyStorage **ppWiaPropertyStorage ) { // Check parameters if (!pwszDeviceId || !*pwszDeviceId) { return E_INVALIDARG; } if (!ppWiaPropertyStorage) { return E_POINTER; } // Initialize the return value *ppWiaPropertyStorage = NULL; CSimpleString strDeviceId = CSimpleStringConvert::NaturalString(CSimpleStringWide(pwszDeviceId)); CComPtr pWiaDevMgr; HRESULT hr = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr ); if (SUCCEEDED(hr)) { // Assume we are going to fail. This will also cover the case where there are no devices. hr = E_FAIL; CDeviceList deviceList( pWiaDevMgr ); for (int i=0;iAddRef(); hr = S_OK; break; } } } } return hr; } // Be careful calling this function. It is hideously slow... HRESULT GetDeviceTypeFromId( LPCWSTR pwszDeviceId, LONG *pnDeviceType ) { // Check parameters if (!pwszDeviceId || !*pwszDeviceId) { return E_INVALIDARG; } if (!pnDeviceType) { return E_POINTER; } CComPtr pWiaPropertyStorage; HRESULT hr = GetDeviceInfoFromId( pwszDeviceId, &pWiaPropertyStorage ); if (SUCCEEDED(hr)) { LONG nDeviceType; if (PropStorageHelpers::GetProperty(pWiaPropertyStorage,WIA_DIP_DEV_TYPE,nDeviceType)) { *pnDeviceType = nDeviceType; hr = S_OK; } else { hr = E_FAIL; } } return hr; } // Ask WIA for the default event handler for the device HRESULT GetDefaultEventHandler (IWiaItem *pItem, const GUID &guidEvent, WIA_EVENT_HANDLER *pwehHandler) { HRESULT hr; IEnumWIA_DEV_CAPS *pEnum; WIA_EVENT_HANDLER weh; ZeroMemory (pwehHandler, sizeof(WIA_EVENT_HANDLER)); hr = pItem->EnumRegisterEventInfo (0, &guidEvent, &pEnum); if (SUCCEEDED(hr)) { ULONG ul; bool bFound = false; while (!bFound && NOERROR == pEnum->Next (1, &weh, &ul)) { if (weh.ulFlags & WIA_IS_DEFAULT_HANDLER) { bFound = true; CopyMemory (pwehHandler, &weh, sizeof(weh)); } else { if (weh.bstrDescription) { SysFreeString (weh.bstrDescription); } if (weh.bstrIcon) { SysFreeString (weh.bstrIcon); } if (weh.bstrName) { SysFreeString (weh.bstrName); } } } if (!bFound) { hr = E_FAIL; } pEnum->Release (); } return hr; } /****************************************************************************** ItemAndChildrenCount Returns the number of items, including root + children ******************************************************************************/ LONG ItemAndChildrenCount (IWiaItem *pRoot) { LONG count = 0; HRESULT hr = S_OK; IEnumWiaItem *pEnum; LONG lType; if (pRoot) { if (SUCCEEDED(pRoot->EnumChildItems(&pEnum))) { IWiaItem *pChild; while (NOERROR == pEnum->Next(1, &pChild, NULL)) { count++; pChild->Release (); } pEnum->Release (); } // // See if we should count the root item // pRoot->GetItemType(&lType); if (!(lType & WiaItemTypeRoot)) { count++; } } return count; } /****************************************************************************** DeleteItemAndChildren Deletes all items in the tree under pRoot ******************************************************************************/ HRESULT DeleteItemAndChildren (IWiaItem *pRoot) { HRESULT hr = S_OK; IEnumWiaItem *pEnum; if (pRoot) { // Recurse down til we reach a leaf item if (SUCCEEDED(pRoot->EnumChildItems(&pEnum))) { IWiaItem *pChild; while (SUCCEEDED(hr) && NOERROR == pEnum->Next(1, &pChild, NULL)) { hr = DeleteItemAndChildren (pChild); pChild->Release (); } pEnum->Release (); } // now delete the item itself // if a delete on a child item failed, stop trying // to delete because chances are any subsequent delete // is going to fail as well. if (SUCCEEDED(hr)) { // don't delete the very root item LONG lType; pRoot->GetItemType(&lType); if (!(lType & WiaItemTypeRoot)) { hr = pRoot->DeleteItem(0); } } } return hr; } } // End namespace WiaUiUtil