1654 lines
48 KiB
C++
1654 lines
48 KiB
C++
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// File:
|
|
// utils.h
|
|
//
|
|
// Contents:
|
|
// prototypes and constants for OLE internal utility routines
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History:
|
|
// 11/28/93 - ChrisWe - file inspection and cleanup begins
|
|
// 11/29/93 - ChrisWe - remove signature for non-existent
|
|
// function UtGlobalHandlCpy; moved manifest constants
|
|
// to be with functions they are used with (OPCODE_*,
|
|
// CONVERT_*); removed default parameters from functions;
|
|
// replace '!' with '~' in STREAMTYPE_OTHER definition
|
|
// 04/07/94 - AlexGo - added UtCreateStorageOnHGlobal
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef _UTILS_H_
|
|
#define _UTILS_H_
|
|
|
|
// We need to serialize the placeable metafile structure in the same format
|
|
// that was used by WIN16, since RECT used LONGs under Win32.
|
|
// We ensure that no padding is added by using the #pragma pack() calls.
|
|
|
|
#pragma pack(1)
|
|
typedef struct tagWIN16RECT
|
|
{
|
|
WORD left;
|
|
WORD top;
|
|
WORD right;
|
|
WORD bottom;
|
|
} WIN16RECT;
|
|
|
|
typedef struct tagPLACEABLEMETAHEADER
|
|
{
|
|
DWORD key; /* must be PMF_KEY */
|
|
#define PMF_KEY 0x9ac6cdd7
|
|
WORD hmf; /* must be zero */
|
|
WIN16RECT bbox; /* bounding rectangle of the metafile */
|
|
WORD inch; /* # of metafile units per inch must be < 1440 */
|
|
/* most apps use 576 or 1000 */
|
|
DWORD reserved; /* must be zero */
|
|
WORD checksum;
|
|
} PLACEABLEMETAHEADER;
|
|
#pragma pack()
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtGetUNICODEData, PRIVATE INTERNAL
|
|
//
|
|
// Synopsis: Given a string length, and two pointers (one ANSI, one
|
|
// OLESTR), returns the UNICODE version of whichever string
|
|
// is valid.
|
|
//
|
|
// Effects: Memory is allocated on the caller's pointer for new OLESTR
|
|
//
|
|
// Arguments: [ulLength] -- length of string in CHARACTERS (not bytes)
|
|
// (including terminator)
|
|
// [szANSI] -- candidate ANSI string
|
|
// [szOLESTR] -- candidate OLESTR string
|
|
// [pstr] -- OLESTR OUT parameter
|
|
//
|
|
// Returns: NOERROR on success
|
|
// E_OUTOFMEMORY on allocation failure
|
|
// E_ANSITOUNICODE if ANSI cannot be converted to UNICODE
|
|
//
|
|
// Algorithm: If szOLESTR is available, a simple copy is performed
|
|
// If szOLESTR is not available, szANSI is converted to UNICODE
|
|
// and the result is copied.
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 08-Mar-94 davepl Created
|
|
//
|
|
// Notes: Only one of the two input strings (ANSI or UNICODE) should
|
|
// be set on entry.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
INTERNAL UtGetUNICODEData( ULONG, LPSTR, LPOLESTR, LPOLESTR *);
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtPutUNICODEData, PRIVATE INTERNAL
|
|
//
|
|
// Synopsis: Given an OLESTR and two possible buffer pointer, one ANSI
|
|
// and the other OLESTR, this fn tries to convert the string
|
|
// down to ANSI. If it succeeds, it allocates memory on the
|
|
// ANSI ptr for the result. If it fails, it allocates memory
|
|
// on the UNICODE ptr and copies the input string over. The
|
|
// length of the final result (ANSI or UNICODE) is returned
|
|
// in dwResultLen.
|
|
//
|
|
// Arguments: [ulLength] -- input length of OLESTR str
|
|
// [str] -- the OLESTR to store
|
|
// [pszANSI] -- candidate ANSI str ptr
|
|
// [pszOLESTR] -- candidate OLESTR str ptr
|
|
// [pdwResultLen] -- where to store the length of result
|
|
//
|
|
// Returns: NOERROR on success
|
|
// E_OUTOFMEMORY on allocation failure
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 08-Mar-94 davepl Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
INTERNAL UtPutUNICODEData(
|
|
ULONG ulLength,
|
|
LPOLESTR str,
|
|
LPSTR * pszANSI,
|
|
LPOLESTR * pszOLESTR,
|
|
DWORD * pdwResultLen );
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtDupGlobal, internal
|
|
//
|
|
// Synopsis:
|
|
// Duplicate the contents of an HGlobal into a new HGlobal. If
|
|
// there is no allocated memory, no new global is allocated.
|
|
//
|
|
// Arguments:
|
|
// [hsrc] -- the source HGLobal; need not be locked
|
|
// [uiFlags] -- flags to be passed on to GlobalAlloc()
|
|
//
|
|
// Returns:
|
|
// The new HGLOBAL, if successful, or NULL
|
|
//
|
|
// History:
|
|
// 11/28/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(HANDLE) UtDupGlobal(HANDLE hSrc, UINT uiFlags);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtIsFormatSupported, internal
|
|
//
|
|
// Synopsis:
|
|
// Checks a data object to see if it will accept
|
|
// IDataObject::SetData() and/or IDataObject::GetData() calls
|
|
// on the specified format. The direction of transfer is specified
|
|
// with the dwDirection flags. The function returns TRUE only
|
|
// if all requested transfers are possible.
|
|
//
|
|
// Arguments:
|
|
// [lpObj] -- the data object to check for the format
|
|
// [dwDirection] -- a combination of values from DATADIR_*
|
|
// [cfFormat] -- the format to look for
|
|
//
|
|
// Returns:
|
|
// TRUE, if transfers of [cfFormat] are supported in [dwDirection],
|
|
// FALSE otherwise
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/29/93 - ChrisWe - file inspection and cleanup; noted that
|
|
// enumerators are expected to be able to return
|
|
// formats for multiple DATADIR_* flags
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) UtIsFormatSupported(LPDATAOBJECT lpObj, DWORD dwDirection,
|
|
CLIPFORMAT cfFormat);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtDupString, internal
|
|
//
|
|
// Synopsis:
|
|
// Copies the argument string into a new string allocated
|
|
// using the task allocator
|
|
//
|
|
// Arguments:
|
|
// [lpszIn] -- the string to duplicate
|
|
//
|
|
// Returns:
|
|
// a pointer to a copy of [lpszIn], or NULL if the allocator
|
|
// could not be acquired, or was out of memory
|
|
//
|
|
// History:
|
|
// 11/28/93 - ChrisWe - file cleanup and inspection
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(LPOLESTR) UtDupString(LPCOLESTR lpszIn);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: utGetProtseqFromTowerId
|
|
//
|
|
// Synopsis: Get protseq string from DCE TowerID
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [wTowerId] -- TowerID to retrieve
|
|
//
|
|
// Returns: protseq string - NULL if not found
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 28-Oct-96 t-KevinH Created as findProtseq
|
|
// 06-Feb-97 Ronans Converted to utility fn
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
FARINTERNAL_(LPCWSTR) utGetProtseqFromTowerId(USHORT wTowerId);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: utGetTowerId
|
|
//
|
|
// Synopsis: Get DCE TowerId for protseq string
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [pwszProtseq] -- string to look up
|
|
//
|
|
// Returns: protseq string - NULL if not found
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 28-Oct-96 t-KevinH Created as findProtseq
|
|
// 06-Feb-97 Ronans Converted to utility fn
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
FARINTERNAL_(USHORT) utGetTowerId(LPCWSTR pwszProtseq);
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtDupStringA
|
|
//
|
|
// Synopsis: Duplicates an ANSI string using the TASK allocator
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [pszAnsi] -- the string to duplicate
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: the newly allocated string duplicate or NULL
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 04-Jun-94 alexgo author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
LPSTR UtDupStringA( LPCSTR pszAnsi );
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtCopyFormatEtc, internal
|
|
//
|
|
// Synopsis:
|
|
// Copies a format etc, creating copies of data structures
|
|
// pointed to inside (the target device descriptor.)
|
|
//
|
|
// Arguments:
|
|
// [pFetcIn] -- pointer to the FORMATETC to copy
|
|
// [pFetcCopy] -- pointer to where to copy the FORMATETC to
|
|
//
|
|
// Returns:
|
|
// FALSE if pointed to data could not be copied because it
|
|
// could not be allocated
|
|
// TRUE otherwise
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/01/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) UtCopyFormatEtc(FORMATETC FAR* pFetcIn,
|
|
FORMATETC FAR* pFetcCopy);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtCompareFormatEtc, internal
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
// [pFetcLeft] -- pointer to a FORMATETC
|
|
// [pFetcRight] -- pointer to a FORMATETC
|
|
//
|
|
// Returns:
|
|
// UTCMPFETC_EQ is the two FORMATETCs match exactly
|
|
// UTCMPFETC_NEQ if the two FORMATETCs do not match
|
|
// UTCMPFETC_PARTIAL if the left FORMATETC is a subset of the
|
|
// right: fewer aspects, null target device, or
|
|
// fewer media
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/01/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(int) UtCompareFormatEtc(FORMATETC FAR* pFetcLeft,
|
|
FORMATETC FAR* pFetcRight);
|
|
#define UTCMPFETC_EQ 0 /* exact match */
|
|
#define UTCMPFETC_NEQ 1 /* no match */
|
|
#define UTCMPFETC_PARTIAL (-1) /* partial match; left is subset of right */
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtCompareTargetDevice, internal
|
|
//
|
|
// Synopsis:
|
|
// Compares two target devices to see if they are the same
|
|
//
|
|
// Arguments:
|
|
// [ptdLeft] -- pointer to a target device description
|
|
// [ptdRight] -- pointer to a target device description
|
|
//
|
|
// Returns:
|
|
// TRUE if the two devices are the same, FALSE otherwise
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/01/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) UtCompareTargetDevice(DVTARGETDEVICE FAR* ptdLeft,
|
|
DVTARGETDEVICE FAR* ptdRight);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtCopyStatData, internal
|
|
//
|
|
// Synopsis:
|
|
// Copies the contents of one STATDATA into another, including
|
|
// creating a copy of data pointed to, and incrementing the
|
|
// reference count on the advise sink to reflect the copy.
|
|
//
|
|
// Arguments:
|
|
// [pSDIn] -- the source STATDATA
|
|
// [pSDCopy] -- where to copy the information to
|
|
//
|
|
// Returns:
|
|
// FALSE if memory could not be allocated for the copy of
|
|
// the target device, TRUE otherwise
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/01/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) UtCopyStatData(STATDATA FAR* pSDIn, STATDATA FAR* pSDCopy);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtReleaseStatData, internal
|
|
//
|
|
// Synopsis:
|
|
// Release resources associated with the argument STATDATA; this
|
|
// frees the device description within the FORMATETC, and releases
|
|
// the advise sink, if there is one.
|
|
//
|
|
// Arguments:
|
|
// [pStatData] -- The STATDATA to clean up
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/01/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(void) UtReleaseStatData(STATDATA FAR* pStatData);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtDupPalette, internal
|
|
//
|
|
// Synopsis:
|
|
// Creates a duplicate palette.
|
|
//
|
|
// Arguments:
|
|
// [hpalette] -- the palette to duplicate
|
|
//
|
|
// Returns:
|
|
// if successful, a handle to the duplicate palette; if any
|
|
// allocations or calls fail during the duplication process, NULL
|
|
//
|
|
// History:
|
|
// 11/29//93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(HPALETTE) UtDupPalette(HPALETTE hpalette);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtPaletteSize, internal
|
|
//
|
|
// Synopsis:
|
|
// Returns the size of a color table for a palette given the
|
|
// number of bits of color desired.
|
|
//
|
|
// Arguments:
|
|
// [lpHeader] -- ptr to BITMAPINFOHEADER structure
|
|
//
|
|
// Returns:
|
|
// Size in bytes of color information
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/29/93 - ChrisWe - change bit count argument to unsigned,
|
|
// and return value to size_t
|
|
//
|
|
// 07/18/94 - DavePl - Fixed for 16, 24, 32bpp DIBs
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(size_t) UtPaletteSize(BITMAPINFOHEADER *);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtFormatToTymed, internal
|
|
//
|
|
// Synopsis:
|
|
// Maps a clipboard format to a medium used to transport it.
|
|
//
|
|
// Arguments:
|
|
// [cf] -- the clipboard format to map
|
|
//
|
|
// Returns:
|
|
// a TYMED_* value
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/29/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(DWORD) UtFormatToTymed(CLIPFORMAT cf);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtQueryPictFormat, internal
|
|
//
|
|
// Synopsis:
|
|
// Check to see if the argument data object supports one of
|
|
// our preferred data formats for presentations:
|
|
// CF_METAFILEPICT, CF_DIB, CF_BITMAP, in that order. Returns
|
|
// TRUE, if success, and alters the given format descriptor
|
|
// to match the supported format. The given format descriptor
|
|
// is not altered if there is no match.
|
|
//
|
|
// Arguments:
|
|
// [lpSrcDataObj] -- the data object to query
|
|
// [lpforetc] - the format descriptor
|
|
//
|
|
// Returns:
|
|
// TRUE if a preferred format is found, FALSE otherwise
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/09/93 - ChrisWe - modified to not alter the descriptor
|
|
// if no match is found
|
|
// 11/09/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) UtQueryPictFormat(LPDATAOBJECT lpSrcDataObj,
|
|
LPFORMATETC lpforetc);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtConvertDibToBitmap, internal
|
|
//
|
|
// Synopsis:
|
|
// Converts a DIB to a bitmap, returning a new handle to the
|
|
// bitmap. The original DIB is left untouched.
|
|
//
|
|
// Arguments:
|
|
// [hDib] -- handle to the DIB to convert
|
|
//
|
|
// Returns:
|
|
// if successful, and handle to the new bitmap
|
|
//
|
|
// Notes:
|
|
// REVIEW, the function uses the screen DC when creating the
|
|
// new bitmap. It may be the case that the bitmap was intended
|
|
// for another target, in which case this may not be appropriate.
|
|
// It may be necessary to alter this function to take a DC as
|
|
// an argument.
|
|
//
|
|
// History:
|
|
// 11/29/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(HBITMAP) UtConvertDibToBitmap(HANDLE hDib);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtConvertBitmapToDib, internal
|
|
//
|
|
// Synopsis:
|
|
// Creates a Device Independent Bitmap capturing the content of
|
|
// the argument bitmap.
|
|
//
|
|
// Arguments:
|
|
// [hBitmap] -- Handle to the bitmap to convert
|
|
// [hpal] -- color palette for the bitmap; may be null for
|
|
// default stock palette
|
|
//
|
|
// Returns:
|
|
// Handle to the DIB. May be null if any part of the conversion
|
|
// failed.
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/29/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(HANDLE) UtConvertBitmapToDib(HBITMAP hBitmap, HPALETTE hpal);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetClassId, internal
|
|
//
|
|
// Synopsis:
|
|
// Attempt to find the class id of the object. First,
|
|
// query for IOleObject, and if successful, call
|
|
// IOleObject::GetUserClassID(). If that fails, query for
|
|
// IPersist, and if successful, call IPersist::GetClassID.
|
|
//
|
|
// Arguments:
|
|
// [lpUnk] -- pointer to an IUnknown instance
|
|
// [lpClsid] -- pointer to where to copy the class id to
|
|
//
|
|
// Returns:
|
|
// TRUE, if the class id was obtained, or FALSE otherwise
|
|
// If unsuccessful, *[lpClsid] is set to CLSID_NULL
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/29/93 - ChrisWe - change to return BOOL to indicate success
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) UtGetClassID(LPUNKNOWN lpUnk, CLSID FAR* lpClsid);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtCopyTargetDevice, internal
|
|
//
|
|
// Synopsis:
|
|
// Allocates a new target device description, and copies
|
|
// the given one into it
|
|
//
|
|
// Arguments:
|
|
// [ptd] -- pointer to a target device
|
|
//
|
|
// Returns:
|
|
// NULL, if the no memory can be allocated
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/01/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(DVTARGETDEVICE FAR*) UtCopyTargetDevice(DVTARGETDEVICE FAR* ptd);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetIconData, internal
|
|
//
|
|
// Synopsis:
|
|
// Attempts to get the icon for an object.
|
|
//
|
|
// Arguments:
|
|
// [lpSrcDataObj] -- The source data object
|
|
// [rclsid] -- the class id the object is known to be
|
|
// (may be CLSID_NULL)
|
|
// [lpforetc] -- the format of the data to fetch
|
|
// [lpstgmed] -- a place to return the medium it was fetched on
|
|
//
|
|
// Returns:
|
|
// E_OUTOFMEMORY, S_OK
|
|
//
|
|
// Notes:
|
|
// REVIEW, this method seems to assume that the contents of
|
|
// lpforetc are correct for fetching an icon. It passes this
|
|
// on to [lpSrcDataObj]->GetData first, and if that fails,
|
|
// calls OleGetIconOfClass, without checking the requested
|
|
// format in lpforetc. This could fetch anything
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtGetIconData(LPDATAOBJECT lpSrcDataObj, REFCLSID rclsid,
|
|
LPFORMATETC lpforetc, LPSTGMEDIUM lpstgmed);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtDoStreamOperation, internal
|
|
//
|
|
// Synopsis:
|
|
// Iterate over the streams in [pstgSrc], performing the
|
|
// operation indicated by [iOpCode] to those that are specified
|
|
// by [grfAllowedStmTypes].
|
|
//
|
|
// Arguments:
|
|
// [pstgSrc] -- source IStorage instance
|
|
// [pstgDst] -- destination IStorage instance; may be null for
|
|
// some operations (OPCODE_REMOVE)
|
|
// [iOpCode] -- 1 value from the OPCODE_* values below
|
|
// [grfAllowedStmTypes] -- a logical or of one or more of the
|
|
// STREAMTYPE_* values below
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
STDAPI UtDoStreamOperation(LPSTORAGE pstgSrc, LPSTORAGE pstgDst,
|
|
int iOpCode, DWORD grfAllowedStmTypes);
|
|
|
|
#define OPCODE_COPY 1 /* copy the stream from pstgSrc to pstgDst */
|
|
#define OPCODE_REMOVE 2 /* delete the stream from pstgSrc */
|
|
#define OPCODE_MOVE 3 /* move the stream from pstgSrc to pstgDst */
|
|
#define OPCODE_EXCLUDEFROMCOPY 4
|
|
/* unimplemented, undocumented, intent unknown */
|
|
|
|
#define STREAMTYPE_CONTROL 0x00000001 /* OLE 0x1 stream (REVIEW const) */
|
|
#define STREAMTYPE_CACHE 0x00000002 /* OLE 0x2 stream (REVIEW const) */
|
|
#define STREAMTYPE_CONTAINER 0x00000004 /* OLE 0x3 stream (REVIEW const) */
|
|
#define STREAMTYPE_OTHER \
|
|
(~(STREAMTYPE_CONTROL | STREAMTYPE_CACHE | STREAMTYPE_CONTAINER))
|
|
#define STREAMTYPE_ALL 0xFFFFFFFF /* all stream types are allowed */
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetPresStreamName, internal
|
|
//
|
|
// Synopsis:
|
|
// Modify [lpszName] to be a presentation stream name based
|
|
// on [iStreamNum].
|
|
//
|
|
// Arguments:
|
|
// [lpszName] -- a copy of OLE_PRESENTATION_STREAM; see below
|
|
// [iStreamNum] -- the number of the stream
|
|
//
|
|
// Notes:
|
|
// The digit field of [lpszName] is always completely overwritten,
|
|
// allowing repeated use of UtGetPresStreamName() on the same
|
|
// string; this removes the need to repeatedly start with a fresh
|
|
// copy of OLE_PRESENTATION_STREAM each time this is used in a
|
|
// loop.
|
|
//
|
|
// The validity of the implementation depends on the values of
|
|
// OLE_PRESENTATION_STREAM and OLE_MAX_PRES_STREAMS; if those
|
|
// change, the implementation must change
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(void)UtGetPresStreamName(LPOLESTR lpszName, int iStreamNum);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtRemoveExtraOlePresStreams, internal
|
|
//
|
|
// Synopsis:
|
|
// Deletes presentation streams in [pstg] starting with the
|
|
// presentation numbered [iStart]. All streams after that one
|
|
// (numbered sequentially) are deleted, up to OLE_MAX_PRES_STREAMS.
|
|
//
|
|
// Arguments:
|
|
// [pstg] -- the IStorage instance to operate on
|
|
// [iStart] -- the number of the first stream to remove
|
|
//
|
|
// Returns:
|
|
//
|
|
// Notes:
|
|
// The presentation stream names are generated with
|
|
// UtGetPresStreamName().
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(void) UtRemoveExtraOlePresStreams(LPSTORAGE pstg, int iStart);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtCreateStorageOnHGlobal
|
|
//
|
|
// Synopsis: creates a storage on top of an HGlobal
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [hGlobal] -- the memory on which to create the
|
|
// storage
|
|
// [fDeleteOnRelease] -- if TRUE, then delete the memory
|
|
// ILockBytes once the storage is
|
|
// released.
|
|
// [ppStg] -- where to put the storage interface
|
|
// [ppILockBytes] -- where to put the underlying ILockBytes,
|
|
// maybe NULL. The ILB must be released.
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm: create an ILockBytes on HGLOBAL and then create the docfile
|
|
// on top of the ILockBytes
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 07-Apr-94 alexgo author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT UtCreateStorageOnHGlobal( HGLOBAL hGlobal, BOOL fDeleteOnRelease,
|
|
IStorage **ppStg, ILockBytes **ppILockBytes );
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtGetTempFileName
|
|
//
|
|
// Synopsis: retrieves a temporary filename (for use in GetData, TYMED_FILE
|
|
// and temporary docfiles)
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [pszPrefix] -- prefix of the temp filename
|
|
// [pszTempName] -- buffer that will receive the temp path.
|
|
// must be MAX_PATH or greater.
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT;
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm: tries to get a file in the temp directory, failing that, in
|
|
// the windows directory
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 07-Apr-94 alexgo author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT UtGetTempFileName( LPOLESTR pszPrefix, LPOLESTR pszTempName );
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtHGLOBALToStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Write the contents of an HGLOBAL to a stream
|
|
//
|
|
// Arguments:
|
|
// [hdata] -- handle to the data to write out
|
|
// [dwSize] -- size of the data to write out
|
|
// [pstm] -- stream to write the data out to; on exit, the
|
|
// stream is positioned after the written data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
HRESULT UtHGLOBALtoStm(HANDLE hdata, DWORD dwSize, LPSTREAM pstm);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtHGLOBALtoHGLOBAL, internal
|
|
//
|
|
// Synopsis: Copies the source HGLOBAL into the target HGLOBAL
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [hGlobalSrc] -- the source HGLOBAL
|
|
// [dwSize] -- the number of bytes to copy
|
|
// [hGlobalTgt] -- the target HGLOBAL
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 10-Apr-94 alexgo author
|
|
//
|
|
// Notes: this function will fail if the target hglobal is not large
|
|
// enough
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT UtHGLOBALtoHGLOBAL( HGLOBAL hGlobalSrc, DWORD dwSize,
|
|
HGLOBAL hGlobalTgt);
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtHGLOBALtoStorage, internal
|
|
//
|
|
// Synopsis: Copies the source HGLOBAL into the target storage
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [hGlobalSrc] -- the source HGLOBAL
|
|
// [hpStg] -- the target storage
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 10-Apr-94 alexgo author
|
|
//
|
|
// Notes: this function will fail if the source HGLOBAL did not
|
|
// originally have a storage layered on top of it.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT UtHGLOBALtoStorage( HGLOBAL hGlobalSrc, IStorage *pStg);
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtHGLOBALtoFile, internal
|
|
//
|
|
// Synopsis: Copies the source HGLOBAL into the target file
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [hGlobalSrc] -- the source HGLOBAL
|
|
// [dwSize] -- the number of bytes to copy
|
|
// [pszFileName] -- the target file
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 10-Apr-94 alexgo author
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
HRESULT UtHGLOBALtoFile( HGLOBAL hGlobalSrc, DWORD dwSize,
|
|
LPCOLESTR pszFileName);
|
|
|
|
|
|
/*** Following routines can be found in convert.cpp *****/
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetHGLOBALFromStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Create a new HGLOBAL, and read [dwSize] bytes into it
|
|
// from [lpstream].
|
|
//
|
|
// Arguments:
|
|
// [lpstream] -- the stream to read the content of the new
|
|
// HGLOBAL from; on exit, points just past the data read
|
|
// [dwSize] -- the amount of material to read from the stream
|
|
// [lphPres] -- pointer to where to return the new handle
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
// In case of any error, the new handle is freed. If the
|
|
// amount of material expected from [lpstream] is less than
|
|
// [dwSize], nothing is returned.
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtGetHGLOBALFromStm(LPSTREAM lpstream, DWORD dwSize,
|
|
HANDLE FAR* lphPres);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetHDIBFromDIBFileStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Produce a handle to a DIB from a file stream
|
|
//
|
|
// Arguments:
|
|
// [pstm] -- the stream to read the DIB from; on exit, the
|
|
// stream is positioned just past the data read
|
|
// [lphdata] -- pointer to where to return the handle to the data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtGetHDIBFromDIBFileStm(LPSTREAM pstm, HANDLE FAR* lphdata);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetHMFPICT, internal
|
|
//
|
|
// Synopsis:
|
|
// Given a handle to a METAFILE, conjure up a handle to a
|
|
// METAFILEPICT, based on the metafile
|
|
//
|
|
// Arguments:
|
|
// [hMF] -- handle to the METAFILE
|
|
// [fDeleteOnError] -- if TRUE, delete the METAFILE [hMF] in there
|
|
// is any error
|
|
// [xExt] -- the x extent of the desired METAFILEPICT
|
|
// [yExt] -- the y extent of the desired METAFILEPICT
|
|
//
|
|
// Returns:
|
|
// Handle to the new METAFILEPICT, if successful, or NULL
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(HANDLE) UtGetHMFPICT(HMETAFILE hMF, BOOL fDeletOnError,
|
|
DWORD xExt, DWORD yExt);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetHMFFromMFStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Create a handle to a METAFILE, loaded with content from
|
|
// the given stream
|
|
//
|
|
// Arguments:
|
|
// [lpstream] -- the source stream to initialize the METAFILE with;
|
|
// on exit, the stream is positioned just past the
|
|
// data read
|
|
// [dwSize] -- the amount of material to read from [lpstream]
|
|
// [fConvert] -- if TRUE, tries to convert a Macintosh QuickDraw
|
|
// file to METAFILE format
|
|
// [lphPres] -- pointer to where to return the new handle to
|
|
// the metafile
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
// If [dwSize] is too large, and goes past the end of the
|
|
// stream, the error causes everything allocated to be freed,
|
|
// and nothing is returned in [lphPres].
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtGetHMFFromMFStm(LPSTREAM lpstream, DWORD dwSize,
|
|
BOOL fConvert, HANDLE FAR* lphPres);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetSizeAndExtentsFromPlaceableMFStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Obtain the size, width, and height of the metafile stored
|
|
// in a placeable metafile stream.
|
|
//
|
|
// Arguments:
|
|
// [lpstream] -- the stream to read the placeable metafile
|
|
// from; on exit, the stream is positioned at the
|
|
// beginning of the metafile header, after the
|
|
// placeable metafile header.
|
|
// [pdwSize] -- a pointer to where to return the size of the
|
|
// metafile; may be NULL
|
|
// [plWidth] -- a pointer to where to return the width of the
|
|
// metafile; may be NULL
|
|
// [plHeight] -- a pointer to where to return the height of the
|
|
// metafile; may be NULL
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtGetSizeAndExtentsFromPlaceableMFStm(LPSTREAM pstm,
|
|
DWORD FAR* dwSize, LONG FAR* plWidth, LONG FAR* plHeight);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetHMFPICTFromPlaceableMFStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Create a handle to a METAFILEPICT initialized from a
|
|
// placeable METAFILE stream.
|
|
//
|
|
// Arguments:
|
|
// [pstm] -- the stream to load the METAFILE from; on exit
|
|
// points just past the METAFILE data
|
|
// [lphdata] -- pointer to where to return the handle to the
|
|
// new METAFILEPICT
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 11/30/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtGetHMFPICTFromPlaceableMFStm(LPSTREAM pstm, HANDLE FAR* lphdata);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetDibExtents, internal
|
|
//
|
|
// Synopsis:
|
|
// Return the width and height of a DIB, in HIMETRIC units
|
|
// per pixel.
|
|
//
|
|
// Arguments:
|
|
// [lpbmi] -- pointer to a BITMAPINFOHEADER
|
|
// [plWidth] -- pointer to where to return the width
|
|
// REVIEW, this should be a DWORD
|
|
// [plHeight] -- pointer to where to return the height
|
|
// REVIEW, this should be a DWORD
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(void) UtGetDibExtents(LPBITMAPINFOHEADER lpbmi,
|
|
LONG FAR* plWidth, LONG FAR* plHeight);
|
|
#ifdef LATER
|
|
FARINTERNAL_(void) UtGetDibExtents(LPBITMAPINFOHEADER lpbmi,
|
|
DWORD FAR* pdwWidth, DWORD FAR* pdwHeight);
|
|
#endif
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtHDIBToDIBFileStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Given a handle to a DIB, write out out a DIB file stream.
|
|
//
|
|
// Arguments:
|
|
// [hdata] -- handle to the DIB
|
|
// [dwSize] -- the size of the DIB
|
|
// [pstm] -- the stream to write the DIB out to; on exit, the
|
|
// stream is positioned after the DIB data; the DIB
|
|
// data is prepended with a BITMAPFILEHEADER
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtHDIBToDIBFileStm(HANDLE hdata, DWORD dwSize, LPSTREAM pstm);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtDIBStmToDIBFileStm, internal
|
|
//
|
|
// Synopsis:
|
|
// copy convert a DIB in a stream to a DIB file stream
|
|
//
|
|
// Arguments:
|
|
// [pstmDIB] -- the source DIB
|
|
// REVIEW, what does CopyTo do to the stream pointer?
|
|
// [dwSize] -- the size of the source DIB
|
|
// [pstmDIBFile] -- where to write the converted DIB file stream;
|
|
// should not be the same as [pstmDIB]; on exit, the
|
|
// stream is positioned after the DIB file data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtDIBStmToDIBFileStm(LPSTREAM pstmDIB, DWORD dwSize,
|
|
LPSTREAM pstmDIBFile);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtHDIBFileToOlePresStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Given a handle to a DIB file, write it out to a stream
|
|
//
|
|
// Arguments:
|
|
// [hdata] -- the handle to the DIB file
|
|
// [pstm] -- the stream to write it out to; on exit, the
|
|
// stream is positioned after the written data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
// A small header with size information precedes the DIB file
|
|
// data.
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtHDIBFileToOlePresStm(HANDLE hdata, LPSTREAM pstm);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtHMFToMFStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Given a handle to a METAFILE, write it out to a METAFILE stream
|
|
//
|
|
// Arguments:
|
|
// [lphMF] -- a *pointer* to a handle to a METAFILE
|
|
// REVIEW, why is this a pointer?
|
|
// [dwSize] -- the size of the METAFILE
|
|
// [lpstream] -- the stream to write the METAFILE out to; on
|
|
// exit, the stream is positioned after the written data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtHMFToMFStm(HANDLE FAR* lphMF, DWORD dwSize, LPSTREAM lpstream);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtHMFToPlaceableMFStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Given a handle to a METAFILE, write it to a stream as a
|
|
// placeable METAFILE
|
|
//
|
|
// Arguments:
|
|
// [lphMF] -- a *pointer* to a METAFILE handle
|
|
// REVIEW, why is this a pointer?
|
|
// [dwSize] -- size of the METAFILE
|
|
// [lWidth] -- width of the metafile
|
|
// REVIEW, in what units?
|
|
// REVIEW, why isn't this a DWORD?
|
|
// [lHeight] -- height of the metafile
|
|
// REVIEW, in what units?
|
|
// REVIEW, why isn't this a DWORD?
|
|
// [pstm] -- the stream to write the data to; on exit, the stream
|
|
// is positioned after the written data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtHMFToPlaceableMFStm(HANDLE FAR* lphMF, DWORD dwSize,
|
|
LONG lWidth, LONG lHeight, LPSTREAM pstm);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtNFStmToPlaceableMFStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Copy converts a METAFILE in a stream to a placeable METAFILE
|
|
// in another stream.
|
|
//
|
|
// Arguments:
|
|
// [pstmMF] -- the IStream instance from which to read the
|
|
// original METAFILE, positioned at the METAFILE
|
|
// REVIEW, where does CopyTo leave this stream pointer?
|
|
// [dwSize] -- the size of the source METAFILE
|
|
// [lWidth] -- the width of the source METAFILE
|
|
// REVIEW, in what units?
|
|
// REVIEW, why isn't this a DWORD?
|
|
// [lHeight] -- the height of the source METAFILE
|
|
// REVIEW, in what units?
|
|
// REVIEW, why isn't this a DWORD?
|
|
// [pstmPMF] -- the IStream instance to which to write the
|
|
// placeable METAFILE; on exit, the stream is positioned
|
|
// after the written data
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtMFStmToPlaceableMFStm(LPSTREAM pstmMF, DWORD dwSize,
|
|
LONG lWidth, LONG lHeight, LPSTREAM pstmPMF);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtWriteOlePresStmHeader, internal
|
|
//
|
|
// Synopsis:
|
|
// Write out the header information for an Ole presentation stream.
|
|
//
|
|
// Arguments:
|
|
// [lpstream] -- the stream to write to; on exit, the stream is
|
|
// positioned after the header information
|
|
// [pforetc] -- pointer to the FORMATETC for the presentation
|
|
// data
|
|
// [dwAdvf] -- the advise control flags for this presentation
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
// This writes the clipboard information, the target device
|
|
// information, if any, some FORMATETC data, and the advise
|
|
// control flags.
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtWriteOlePresStmHeader(LPSTREAM lppstream, LPFORMATETC pforetc,
|
|
DWORD dwAdvf);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtReadOlePresStmHeader, internal
|
|
//
|
|
// Synopsis:
|
|
// Reads the presentation description information from an Ole
|
|
// presentation stream, as written by
|
|
// UtWriteOlePresStmHeader().
|
|
//
|
|
// Arguments:
|
|
// [pstm] -- the IStream instance to read the presentation
|
|
// description data from
|
|
// [pforetc] -- pointer to the FORMATETC to initialize based
|
|
// on data in the stream
|
|
// [pdwAdvf] -- pointer to where to put the advise flags for
|
|
// this presentation; may be NULL
|
|
// [pfConvert] -- pointer to a flag that is set to TRUE if
|
|
// the presentation will require conversion from
|
|
// Macintosh PICT format.
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/02/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtReadOlePresStmHeader(LPSTREAM pstm, LPFORMATETC pforetc,
|
|
DWORD FAR* pdwAdvf, BOOL FAR* pfConvert);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtOlePresStmToContentsStm, internal
|
|
//
|
|
// Synopsis:
|
|
// Copy the content of a presentation stream to a contents stream,
|
|
// adjusting the format as necessary.
|
|
//
|
|
// Arguments:
|
|
// [pstg] -- the IStorage instance in which the presentation
|
|
// stream is, and in which to create the contents stream
|
|
// [lpszPresStm] -- the name of the source presentation stream
|
|
// [fDeletePresStm] -- flag that indicates that the presentation
|
|
// stream should be deleted if the copy and convert is
|
|
// successful. This is ignored if the source was
|
|
// DVASPECT_ICON.
|
|
// [puiStatus] -- pointer to a UINT where status bits from
|
|
// the CONVERT_* values below may be returned.
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
// The content stream is named by the constant OLE_CONTENTS_STREAM.
|
|
//
|
|
// History:
|
|
// 12/05/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL UtOlePresStmToContentsStm(LPSTORAGE pstg, LPOLESTR lpszPresStm,
|
|
BOOL fDeletePresStm, UINT FAR* puiStatus);
|
|
#define CONVERT_NOSOURCE 0x0001
|
|
#define CONVERT_NODESTINATION 0x0002
|
|
#define CONVERT_SOURCEISICON 0x0004
|
|
|
|
// 2nd variation
|
|
FARINTERNAL UtOlePresStmToContentsStm(LPSTORAGE pSrcStg, LPOLESTR lpszPresStm,
|
|
LPSTREAM pDestStm, UINT FAR* puiStatus);
|
|
|
|
FARINTERNAL UtGetHMFPICTFromMSDrawNativeStm(LPSTREAM pstm, DWORD dwSize,
|
|
HANDLE FAR* lphdata);
|
|
|
|
FARINTERNAL UtPlaceableMFStmToMSDrawNativeStm(LPSTREAM pstmPMF,
|
|
LPSTREAM pstmMSDraw);
|
|
|
|
FARINTERNAL UtDIBFileStmToPBrushNativeStm(LPSTREAM pstmDIBFile,
|
|
LPSTREAM pstmPBrush);
|
|
|
|
FARINTERNAL UtContentsStmTo10NativeStm(LPSTORAGE pstg, REFCLSID rclsid,
|
|
BOOL fDeleteContents, UINT FAR* puiStatus);
|
|
|
|
FARINTERNAL Ut10NativeStmToContentsStm(LPSTORAGE pstg, REFCLSID rclsid,
|
|
BOOL fDeleteSrcStm);
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function:
|
|
// UtGetHPRESFromNative, internal
|
|
//
|
|
// Synopsis:
|
|
// Get a handle to a presentation from a native representation.
|
|
//
|
|
// Arguments:
|
|
// [pstg] -- the storage in which the native content is
|
|
// [cfFormat] -- the native format to attempt to read
|
|
// [fOle10Native] -- attempt to read the OLE10_NATIVE_STREAM
|
|
// stream in that format; if this is FALSE, we read the
|
|
// OLE_CONTENTS_STREAM
|
|
//
|
|
// Returns:
|
|
// HRESULT
|
|
//
|
|
// Notes:
|
|
//
|
|
// History:
|
|
// 12/05/93 - ChrisWe - file inspection and cleanup
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
FARINTERNAL_(HANDLE) UtGetHPRESFromNative(LPSTORAGE pstg,
|
|
LPSTREAM pstm, CLIPFORMAT cfFormat, BOOL fOle10Native);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: ConvertPixelsToHIMETRIC
|
|
//
|
|
// Synopsis: Converts a pixel dimension to HIMETRIC units
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [hdcRef] -- the reference DC
|
|
// [ulPels] -- dimension in pixel measurement
|
|
// [pulHIMETRIC] -- OUT param of converted HIMETRIC result
|
|
// [tDimension] -- indicates XDIMENSION or YDIMENSION of input
|
|
//
|
|
// Returns: S_OK, E_FAIL
|
|
//
|
|
// Algorithm: screen_mm * input_pels HIMETRICS/
|
|
// ---------------------- * / == HIMETRICS
|
|
// screen_pels /mm
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 04-Aug-94 Davepl Created
|
|
//
|
|
// Notes: We need to know whether the input size is in the X or
|
|
// Y dimension, since the aspect ratio could vary
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// This enumeration is used to indicate in which diretion a
|
|
// dimension, when passed as a parameter, is to be relative to.
|
|
// This is needed for our Pixel -> HIMETRIC conversion function,
|
|
// since the aspect ratio could vary by dimension.
|
|
|
|
typedef enum tagDIMENSION
|
|
{
|
|
XDIMENSION = 'X',
|
|
YDIMENSION = 'Y'
|
|
} DIMENSION;
|
|
|
|
FARINTERNAL ConvertPixelsToHIMETRIC (HDC hdcRef,
|
|
ULONG lPels,
|
|
ULONG * pulHIMETRIC,
|
|
DIMENSION tDimension);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: IsTaskName
|
|
//
|
|
// Synopsis: Determines if the passed name is the current task
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [lpszIn] -- Task name
|
|
//
|
|
// Returns: TRUE, FALSE
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 03-Mar-95 Scottsk Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
FARINTERNAL_(BOOL) IsTaskName(LPCWSTR lpszIn);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: utGetModuleName
|
|
//
|
|
// Synopsis: Get Module Name for current module
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [lpszModuleName] -- Buffer to hold module name
|
|
// [dwLength] -- length in characters
|
|
//
|
|
// Returns: S_OK, E_UNEXPECTED, E_OUTOFMEMORY
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 06-Feb-97 Ronans Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
FARINTERNAL utGetModuleName(LPWSTR lpszModuleName, DWORD dwLength);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: utGetAppIdForModule
|
|
//
|
|
// Synopsis: Get AppID for the current module in string form
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [lpszAppId] -- Buffer to hold string represntation of AppId
|
|
// [dwLength] -- length of buffer in characters
|
|
//
|
|
// Returns: S_OK, E_UNEXPECTED, E_OUTOFMEMORY or error value from
|
|
// registry functions.
|
|
//
|
|
// History: dd-mmm-yy Author Comment
|
|
// 06-Feb-97 Ronans Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
FARINTERNAL utGetAppIdForModule(LPWSTR lpszAppId, DWORD dwLength);
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UtGetDvtd16Info
|
|
// UtConvertDvtd16toDvtd32
|
|
//
|
|
// UtGetDvtd32Info
|
|
// UtConvertDvtd32toDvtd16
|
|
//
|
|
// Synopsis: Utility functions for converting Ansi to Unicode DVTARGETDEVICEs
|
|
//
|
|
// Algorithm: UtGetDvtdXXInfo gets sizing data, which is then passed to
|
|
// UtConvertDvtdXXtoDvtdXX to perform the conversion.
|
|
//
|
|
// History: 06-May-94 AlexT Created
|
|
//
|
|
// Notes: Here's a sample usage of these functions:
|
|
//
|
|
// // pdvtd16 is a Ansi DVTARGETDEVICE
|
|
// DVTDINFO dvtdInfo;
|
|
// DVTARGETDEVICE pdvtd32;
|
|
//
|
|
// hr = UtGetDvtd16Info(pdvtd16, &dvtdInfo);
|
|
// // check hr
|
|
// pdvtd32 = CoTaskMemAlloc(dvtdInfo.cbConvertSize);
|
|
// // check pdvtd32
|
|
// hr = UtConvertDvtd16toDvtd32(pdvtd16, &dvtdInfo, pdvtd32);
|
|
// // check hr
|
|
// // pdvtd32 now contains the converted data
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
typedef struct
|
|
{
|
|
UINT cbConvertSize;
|
|
UINT cchDrvName;
|
|
UINT cchDevName;
|
|
UINT cchPortName;
|
|
} DVTDINFO, *PDVTDINFO;
|
|
|
|
extern "C" HRESULT UtGetDvtd16Info(DVTARGETDEVICE const UNALIGNED *pdvtd16,
|
|
PDVTDINFO pdvtdInfo);
|
|
extern "C" HRESULT UtConvertDvtd16toDvtd32(DVTARGETDEVICE const UNALIGNED *pdvtd16,
|
|
DVTDINFO const *pdvtdInfo,
|
|
DVTARGETDEVICE *pdvtd32);
|
|
extern "C" HRESULT UtGetDvtd32Info(DVTARGETDEVICE const *pdvtd32,
|
|
PDVTDINFO pdvtdInfo);
|
|
extern "C" HRESULT UtConvertDvtd32toDvtd16(DVTARGETDEVICE const *pdvtd32,
|
|
DVTDINFO const *pdvtdInfo,
|
|
DVTARGETDEVICE UNALIGNED *pdvtd16);
|
|
class CStdIdentity;
|
|
|
|
HRESULT CreateEmbeddingServerHandler(CStdIdentity *pStdId, IUnknown **ppunkServerHandler);
|
|
|
|
// Number to wide-char conversion routine. See xtow.c for description.
|
|
extern "C" BOOL __cdecl our_ultow(
|
|
unsigned long val,
|
|
wchar_t *buf,
|
|
int bufsize,
|
|
int radix
|
|
);
|
|
|
|
#endif // _UTILS_H
|
|
|
|
|