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.
|
|
// faxhelper.cpp : IComponent Interface helpers
//
// these functions help with extracting dataobjects and clipboards
//
// stolen from the MMC SDK.
// Copyright (C) 1997 Microsoft Corporation
// All rights reserved.
//
#include "stdafx.h"
#include "faxhelper.h"
#pragma hdrstop
/////////////////////////////////////////////////////////////////////////////
// We need a few functions to help work with dataobjects and clipboard formats
CFaxDataObject * ExtractOwnDataObject( IN LPDATAOBJECT lpDataObject ) /*++
Routine Description:
This routine extracts a CFaxDataObject from a IDataObject. Arguments:
lpDataObject
Return Value:
CFaxDataObject * on success, NULL on failure.
--*/ { // DebugPrint(( TEXT("Trace: ::ExtractOwnDataObjecct") ));
HRESULT hr = S_OK; HGLOBAL hGlobal; CFaxDataObject *pdo = NULL;
if( lpDataObject == NULL ) { return NULL; }
hr = ExtractFromDataObject(lpDataObject, (CLIPFORMAT)CFaxDataObject::s_cfInternal, sizeof(CFaxDataObject **), &hGlobal);
if(SUCCEEDED(hr)) { pdo = *(CFaxDataObject **)(hGlobal); assert(pdo); assert(!GlobalFree(hGlobal)); }
return pdo; }
HRESULT ExtractFromDataObject( IN LPDATAOBJECT lpDataObject, IN CLIPFORMAT cf, IN ULONG cb, OUT HGLOBAL *phGlobal ) /*++
Routine Description:
Asks the IDataObject for the clipboard format specified in cf Arguments:
lpDataObject - the data object passed in cf - the requested clipboard format cb - the requested number of bytes to allocate for the object phGlobal - the global handle to the newly allocated info
Return Value:
HRESULT indicating SUCCEEDED() or FAILED()
--*/ { // DebugPrint(( TEXT("Trace: ::ExtractFromDataObjecct") ));
HRESULT hr = S_OK; STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL}; FORMATETC formatetc = { cf, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
assert(lpDataObject != NULL); if( lpDataObject == NULL ) { return E_POINTER; }
*phGlobal = NULL;
do { // Allocate memory for the stream
stgmedium.hGlobal = GlobalAlloc(GMEM_SHARE, cb);
if(!stgmedium.hGlobal) { hr = E_OUTOFMEMORY; ATLTRACE(_T("Out of memory\n")); break; }
// Attempt to get data from the object
try { hr = lpDataObject->GetDataHere(&formatetc, &stgmedium); } catch( ... ) { // an exception happened!
hr = E_UNEXPECTED; }
if(FAILED(hr)) { break; }
*phGlobal = stgmedium.hGlobal; stgmedium.hGlobal = NULL; } while(0);
// if the call failed, and we allocated memory,
// free the memory
if(FAILED(hr) && stgmedium.hGlobal) { if(!GlobalFree(stgmedium.hGlobal)) { assert(FALSE); }; } return hr; }
|