/*======================================================================================// | Process Control // | // |Copyright (c) 1998 Sequent Computer Systems, Incorporated. All rights reserved. // | // |File Name: Globals.cpp // | // |Description: // | // |Created: Paul Skoglund 07-1998 // | // |Rev History: // | // |=======================================================================================*/ #include "StdAfx.h" #include "mmc.h" #include "Globals.h" #include "DataObj.h" #include "BaseNode.h" PROPERTY_CHANGE_HDR * AllocPropChangeInfo(CBaseNode *pFolder, int nHint, COMPUTER_CONNECTION_INFO &Target, BOOL bScopeItem, int nPageRef) { PROPERTY_CHANGE_HDR *ptr = (PROPERTY_CHANGE_HDR *) CoTaskMemAlloc(sizeof(PROPERTY_CHANGE_HDR)); if (ptr) { ptr->pFolder = pFolder; ptr->nHint = nHint; ptr->Target = Target; ptr->bScopeItem = bScopeItem; ptr->nPageRef = nPageRef; } return ptr; } PROPERTY_CHANGE_HDR *FreePropChangeInfo(PROPERTY_CHANGE_HDR *pInfo) { if (pInfo) { CoTaskMemFree(pInfo); } return NULL; } const TCHAR *LoadStringHelper(ITEM_STR strOut, int id) { strOut[0] = 0; VERIFY( LoadString(_Module.GetResourceInstance(), id, strOut, MAX_ITEM_LEN) ); return strOut; } HRESULT UpdateRegistryHelper(int Id, BOOL bRegister) { TCHAR SnapinNameStr[MAX_ITEM_LEN]; const TCHAR *SnapinName; struct _ATL_REGMAP_ENTRY MapEntries[] = { { _T("SNAPIN_NAME"), _T("Process Control") }, { NULL, NULL } }; SnapinName = LoadStringHelper(SnapinNameStr, IDS_PROCCON_SNAPIN_NAME); if (SnapinName) { MapEntries[0].szData = SnapinName; } return _Module.UpdateRegistryFromResource(Id, bRegister, MapEntries); } //--------------------------------------------------------------------------- // Returns the current object based on the s_cfInternal clipboard format // CBaseNode* ExtractBaseObject ( LPDATAOBJECT ipDataObject // [in] IComponent pointer ) { HGLOBAL hGlobal; HRESULT hr = S_OK; CBaseNode *pNode = NULL; hr = ExtractFromDataObject( ipDataObject, CDataObject::s_cfBaseInternal, sizeof(CBaseNode **), &hGlobal ); if( SUCCEEDED(hr) ) { pNode = *(CBaseNode **)(hGlobal); ASSERT( NULL != pNode ); HGLOBAL hRetVal = GlobalFree(hGlobal); ASSERT( NULL == hRetVal ); // Must return NULL } return pNode; } // end ExtractBaseObject() CDataObject* ExtractOwnDataObject ( LPDATAOBJECT ipDataObject // [in] IComponent pointer ) { HGLOBAL hGlobal; HRESULT hr = S_OK; CDataObject* pDO = NULL; hr = ExtractFromDataObject( ipDataObject, CDataObject::s_cfInternal, sizeof(CDataObject **), &hGlobal ); if( SUCCEEDED(hr) ) { pDO = *(CDataObject **)(hGlobal); ASSERT( NULL != pDO ); HGLOBAL hRetVal = GlobalFree(hGlobal); ASSERT( NULL == hRetVal ); // Must return NULL } return pDO; } // end ExtractOwnDataObject() //--------------------------------------------------------------------------- // Extracts data based on the passed-in clipboard format // HRESULT ExtractFromDataObject ( LPDATAOBJECT ipDataObject, // [in] Points to data object UINT cfClipFormat, // [in] Clipboard format to use SIZE_T nByteCount, // [in] Number of bytes to allocate HGLOBAL *phGlobal // [out] Points to the data we want ) { HRESULT hr = S_OK; STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL }; FORMATETC formatetc = { (CLIPFORMAT) cfClipFormat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; *phGlobal = NULL; ASSERT( NULL != ipDataObject ); if (!ipDataObject) return E_INVALIDARG; do { // Allocate memory for the stream stgmedium.hGlobal = GlobalAlloc( GMEM_SHARE, nByteCount ); if( !stgmedium.hGlobal ) { hr = E_OUTOFMEMORY; ATLTRACE( _T("Out of memory\n") ); break; } // Attempt to get data from the object hr = ipDataObject->GetDataHere( &formatetc, &stgmedium ); if (FAILED(hr)) { break; } // stgmedium now has the data we need *phGlobal = stgmedium.hGlobal; stgmedium.hGlobal = NULL; } while (0); if (FAILED(hr) && stgmedium.hGlobal) { HGLOBAL hRetVal = GlobalFree(stgmedium.hGlobal); ASSERT( NULL == hRetVal ); // Must return NULL } return hr; } // end ExtractFromDataObject() static UINT s_cfMultiSelect = ::RegisterClipboardFormat(CCF_MMC_MULTISELECT_DATAOBJECT); BOOL IsMMCMultiSelectDataObject(IDataObject* pDataObject) { if (pDataObject == NULL) return FALSE; ASSERT(s_cfMultiSelect != 0); FORMATETC fmt = { (CLIPFORMAT) s_cfMultiSelect, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; return (pDataObject->QueryGetData(&fmt) == S_OK); } // Caller must release memory, by calling LocalFree on the returned pointer TCHAR *FormatErrorMessageIntoBuffer(DWORD nLastError) { TCHAR *pLastErrorText = NULL; UINT_PTR vars[2]; FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (TCHAR *)&pLastErrorText, 0, NULL ); if ( !pLastErrorText ) { FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, _Module.GetResourceInstance(), nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (TCHAR *)&pLastErrorText, 0, NULL ); } // $$ if string was returned consider striping trailing line feed and/or period? if (pLastErrorText) vars[0] = (UINT_PTR) pLastErrorText; else vars[0] = (UINT_PTR) _T(""); vars[1] = (UINT_PTR) (LONG_PTR) nLastError; TCHAR *pMsgBuf = NULL; FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY, _Module.GetResourceInstance(), MSG_OPERATION_FAILED_WITHCODES, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (TCHAR *) &pMsgBuf, 0, // minimum buffer allocation (va_list *) &vars // message inserts ); LocalFree( pLastErrorText ); if (!pMsgBuf) { ASSERT(pMsgBuf); pMsgBuf = (TCHAR *) LocalAlloc(0, 128); if (pMsgBuf) _stprintf( pMsgBuf, TEXT("Error 0x%lx. A description of the error was not located."), nLastError ); // Do NOT localize -- last resort. } return pMsgBuf; } BOOL ReportPCError(DWORD nLastError, HWND hwnd) { TCHAR *pMsgBuf = FormatErrorMessageIntoBuffer(nLastError); if ( pMsgBuf ) { ATLTRACE( (TCHAR *) pMsgBuf ); ATLTRACE( _T("\n") ); int ret = ::MessageBox(hwnd, pMsgBuf, NULL, MB_OK | MB_ICONWARNING); LocalFree(pMsgBuf); return TRUE; } return FALSE; }