windows-nt/Source/XPSP1/NT/printscan/fax/admin/faxadmin/faxhelper.cpp
2020-09-26 16:20:57 +08:00

138 lines
3 KiB
C++

// 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;
}