//____________________________________________________________________________ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1996. // // File: guidhelp.cpp // // Contents: // // Classes: // // Functions: // // History: 9/18/1996 JonN Created // //____________________________________________________________________________ #include #include #include "dbg.h" #include "cstr.h" #ifndef DECLSPEC_UUID #if _MSC_VER >= 1100 #define DECLSPEC_UUID(x) __declspec(uuid(x)) #else #define DECLSPEC_UUID(x) #endif #endif #include #include "guidhelp.h" #include "atlbase.h" // USES_CONVERSION #include "macros.h" USE_HANDLE_MACROS("GUIDHELP(guidhelp.cpp)") #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static CLIPFORMAT g_CFNodeType = 0; static CLIPFORMAT g_CFSnapInCLSID = 0; static CLIPFORMAT g_CFDisplayName = 0; HRESULT ExtractData( IDataObject* piDataObject, CLIPFORMAT cfClipFormat, PVOID pbData, DWORD cbData ) { TEST_NONNULL_PTR_PARAM( piDataObject ); TEST_NONNULL_PTR_PARAM( pbData ); HRESULT hr = S_OK; FORMATETC formatetc = {cfClipFormat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; STGMEDIUM stgmedium = {TYMED_HGLOBAL, NULL}; stgmedium.hGlobal = ::GlobalAlloc(GPTR, cbData); do // false loop { if (NULL == stgmedium.hGlobal) { ASSERT(FALSE); ////AfxThrowMemoryException(); hr = E_OUTOFMEMORY; break; } hr = piDataObject->GetDataHere( &formatetc, &stgmedium ); if ( FAILED(hr) ) { // JonN Jan 7 1999: don't assert here, some errors are perfectly reasonable break; } PVOID pbNewData = reinterpret_cast(stgmedium.hGlobal); if (NULL == pbNewData) { ASSERT(FALSE); hr = E_UNEXPECTED; break; } ::memcpy( pbData, pbNewData, cbData ); } while (FALSE); // false loop if (NULL != stgmedium.hGlobal) { //VERIFY( stgmedium.hGlobal); VERIFY( NULL == ::GlobalFree(stgmedium.hGlobal) ); } return hr; } // ExtractData() HRESULT ExtractString( IDataObject* piDataObject, CLIPFORMAT cfClipFormat, CStr* pstr, // OUT: Pointer to CStr to store data DWORD cchMaxLength) { TEST_NONNULL_PTR_PARAM( piDataObject ); TEST_NONNULL_PTR_PARAM( pstr ); ASSERT( cchMaxLength > 0 ); HRESULT hr = S_OK; FORMATETC formatetc = {cfClipFormat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; STGMEDIUM stgmedium = {TYMED_HGLOBAL, NULL}; stgmedium.hGlobal = ::GlobalAlloc(GPTR, sizeof(WCHAR)*cchMaxLength); do // false loop { if (NULL == stgmedium.hGlobal) { ASSERT(FALSE); ////AfxThrowMemoryException(); hr = E_OUTOFMEMORY; break; } hr = piDataObject->GetDataHere( &formatetc, &stgmedium ); if ( FAILED(hr) ) { // This failure happens when 'searching' for // clipboard format supported by the IDataObject. // t-danmo (24-Oct-96) // Skipping ASSERT( FALSE ); break; } LPWSTR pszNewData = reinterpret_cast(stgmedium.hGlobal); if (NULL == pszNewData) { ASSERT(FALSE); hr = E_UNEXPECTED; break; } pszNewData[cchMaxLength-1] = L'\0'; // just to be safe USES_CONVERSION; *pstr = OLE2T(pszNewData); } while (FALSE); // false loop if (NULL != stgmedium.hGlobal) { VERIFY(NULL == ::GlobalFree(stgmedium.hGlobal)); } return hr; } // ExtractString() HRESULT ExtractSnapInCLSID( IDataObject* piDataObject, CLSID* pclsidSnapin ) { if( !g_CFSnapInCLSID ) { USES_CONVERSION; g_CFSnapInCLSID = (CLIPFORMAT)RegisterClipboardFormat(W2T(CCF_SNAPIN_CLASSID)); // ISSUE-2002/04/01-JonN ASSERT(NULL != g_CFSnapInCLSID) } return ExtractData( piDataObject, g_CFSnapInCLSID, (PVOID)pclsidSnapin, sizeof(CLSID) ); } HRESULT ExtractObjectTypeGUID( IDataObject* piDataObject, GUID* pguidObjectType ) { if( !g_CFNodeType ) { USES_CONVERSION; g_CFNodeType = (CLIPFORMAT)RegisterClipboardFormat(W2T(CCF_NODETYPE)); // ISSUE-2002/04/01-JonN ASSERT(NULL != g_CFSnapInCLSID) } return ExtractData( piDataObject, g_CFNodeType, (PVOID)pguidObjectType, sizeof(GUID) ); } HRESULT GuidToCStr( CStr* pstr, const GUID& guid ) { WCHAR awch[MAX_PATH]; // ISSUE-2002/04/01-JonN call ZeroMemory HRESULT hr = StringFromGUID2(guid, awch, MAX_PATH); // JonN 11/21/00 PREFIX 226769 ASSERT(SUCCEEDED(hr)); USES_CONVERSION; LPTSTR lptstr = OLE2T(awch); *pstr = lptstr; return hr; } HRESULT CStrToGuid( const CStr& str, GUID* pguid ) { USES_CONVERSION; LPOLESTR lpolestr = T2OLE(((LPTSTR)(LPCTSTR)str)); HRESULT hr = CLSIDFromString(lpolestr, pguid); ASSERT(SUCCEEDED(hr)); return hr; } #if 0 HRESULT bstrToGuid( const bstr& str, GUID* pguid ) { HRESULT hr = CLSIDFromString(const_cast((LPCWSTR)str), pguid); ASSERT(SUCCEEDED(hr)); return hr; } #endif HRESULT LoadRootDisplayName(IComponentData* pIComponentData, CStr& strDisplayName) { // ISSUE-2002/04/01-JonN test pIComponentData IDataObject* pIDataObject = NULL; HRESULT hr = pIComponentData->QueryDataObject(NULL, CCT_SNAPIN_MANAGER, &pIDataObject); CHECK_HRESULT(hr); if ( FAILED(hr) ) return hr; if( !g_CFDisplayName ) { USES_CONVERSION; g_CFDisplayName = (CLIPFORMAT)RegisterClipboardFormat(W2T(CCF_DISPLAY_NAME)); // ISSUE-2002/04/01-JonN ASSERT(NULL != g_CFSnapInCLSID) } hr = ExtractString( pIDataObject, g_CFDisplayName, &strDisplayName, MAX_PATH); // CODEWORK maximum length CHECK_HRESULT(hr); if (pIDataObject) pIDataObject->Release(); // JonN 3/28/02 return hr; } HRESULT LoadAndAddMenuItem( IContextMenuCallback* pIContextMenuCallback, UINT nResourceID, // contains text and status text seperated by '\n' long lCommandID, long lInsertionPointID, long fFlags, HINSTANCE hInst, PCTSTR pszLanguageIndependentName) { // ISSUE-2002/04/01-JonN handle these cases ASSERT( pIContextMenuCallback != NULL ); ASSERT( pszLanguageIndependentName != NULL ); CComPtr spiCallback2; HRESULT hr = pIContextMenuCallback->QueryInterface(IID_IContextMenuCallback2, (void **)&spiCallback2); if (FAILED(hr)) return hr; // load the resource CStr strText; strText.LoadString(hInst, nResourceID ); ASSERT( !strText.IsEmpty() ); // split the resource into the menu text and status text CStr strStatusText; int iSeparator = strText.Find(_T('\n')); if (0 > iSeparator) { ASSERT( FALSE ); strStatusText = strText; } else { strStatusText = strText.Right( strText.GetLength()-(iSeparator+1) ); strText = strText.Left( iSeparator ); } // add the menu item USES_CONVERSION; CONTEXTMENUITEM2 contextmenuitem; ::ZeroMemory( &contextmenuitem, sizeof(contextmenuitem) ); contextmenuitem.strName = T2OLE(const_cast((LPCTSTR)strText)); contextmenuitem.strStatusBarText = T2OLE(const_cast((LPCTSTR)strStatusText)); contextmenuitem.lCommandID = lCommandID; contextmenuitem.lInsertionPointID = lInsertionPointID; contextmenuitem.fFlags = fFlags; contextmenuitem.fSpecialFlags = ((fFlags & MF_POPUP) ? CCM_SPECIAL_SUBMENU : 0L); contextmenuitem.strLanguageIndependentName = T2OLE(const_cast(pszLanguageIndependentName)); hr = spiCallback2->AddItem( &contextmenuitem ); ASSERT(hr == S_OK); return hr; } HRESULT AddSpecialSeparator( IContextMenuCallback* pIContextMenuCallback, long lInsertionPointID ) { CONTEXTMENUITEM contextmenuitem; ::ZeroMemory( &contextmenuitem, sizeof(contextmenuitem) ); contextmenuitem.strName = NULL; contextmenuitem.strStatusBarText = NULL; contextmenuitem.lCommandID = 0; contextmenuitem.lInsertionPointID = lInsertionPointID; contextmenuitem.fFlags = MF_SEPARATOR; contextmenuitem.fSpecialFlags = CCM_SPECIAL_SEPARATOR; HRESULT hr = pIContextMenuCallback->AddItem( &contextmenuitem ); ASSERT(hr == S_OK); return hr; } HRESULT AddSpecialInsertionPoint( IContextMenuCallback* pIContextMenuCallback, long lCommandID, long lInsertionPointID ) { // ISSUE-2002/04/01-JonN handle NULL CONTEXTMENUITEM contextmenuitem; ::ZeroMemory( &contextmenuitem, sizeof(contextmenuitem) ); contextmenuitem.strName = NULL; contextmenuitem.strStatusBarText = NULL; contextmenuitem.lCommandID = lCommandID; contextmenuitem.lInsertionPointID = lInsertionPointID; contextmenuitem.fFlags = 0; contextmenuitem.fSpecialFlags = CCM_SPECIAL_INSERTION_POINT; HRESULT hr = pIContextMenuCallback->AddItem( &contextmenuitem ); ASSERT(hr == S_OK); return hr; }