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.
143 lines
5.4 KiB
143 lines
5.4 KiB
/*****************************************************************************
|
|
*
|
|
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
|
|
*
|
|
* TITLE: tmplutil.h
|
|
*
|
|
* VERSION: 1.0
|
|
*
|
|
* AUTHOR: LazarI
|
|
*
|
|
* DATE: 10-Mar-2000
|
|
*
|
|
* DESCRIPTION: Placeholder for common utility templates & functions
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef _TMPLUTIL_H
|
|
#define _TMPLUTIL_H
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// **************************** INCLUDE ALL ****************************
|
|
//
|
|
#include "gensph.h" // generic smart pointers & handles
|
|
#include "comutils.h" // COM utility classes & templates
|
|
#include "w32utils.h" // Win32 utility classes & templates
|
|
#include "cntutils.h" // Containers & Algorithms utility templates
|
|
|
|
// max path limits
|
|
#define SERVER_MAX_PATH (INTERNET_MAX_HOST_NAME_LENGTH + 1 + 2)
|
|
#define PRINTER_MAX_PATH (SERVER_MAX_PATH + MAX_PATH + 1)
|
|
|
|
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) // CRT mem debugging
|
|
////////////////////////////////////////////////////
|
|
// CRT debug flags - infowise
|
|
//
|
|
// _CRTDBG_ALLOC_MEM_DF
|
|
// _CRTDBG_DELAY_FREE_MEM_DF
|
|
// _CRTDBG_CHECK_ALWAYS_DF
|
|
// _CRTDBG_CHECK_CRT_DF
|
|
// _CRTDBG_LEAK_CHECK_DF
|
|
//
|
|
|
|
#define CRT_DEBUG_SET_FLAG(a) _CrtSetDbgFlag( (a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
|
|
#define CRT_DEBUG_CLR_FLAG(a) _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
|
|
|
|
// sends all reports to stdout
|
|
#define CRT_DEBUG_REPORT_TO_STDOUT() \
|
|
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); \
|
|
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); \
|
|
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); \
|
|
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT); \
|
|
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); \
|
|
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT) \
|
|
|
|
// redefine new to be debug new
|
|
#undef new
|
|
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
|
|
|
#else
|
|
#define CRT_DEBUG_SET_FLAG(a) ((void) 0)
|
|
#define CRT_DEBUG_CLR_FLAG(a) ((void) 0)
|
|
#define CRT_DEBUG_REPORT_TO_STDOUT() ((void) 0)
|
|
#endif
|
|
|
|
////////////////////////////////////////////////
|
|
// shell related services
|
|
namespace ShellServices
|
|
{
|
|
// creates a PIDL to a printer in the local printers folder.
|
|
// args:
|
|
// [in] hwnd - window handle (in case we need to show UI - message box)
|
|
// [in] pszPrinterName - full printer name.
|
|
// [out] ppLocalPrnFolder - the printers folder (optional - may be NULL)
|
|
// [out] ppidlPrinter - the PIDL of the printer pointed by pszPrinterName (optional - may be NULL)
|
|
//
|
|
// remarks:
|
|
// pszPrinterName should be fully qualified printer name, i.e. if printer connection it should be
|
|
// like "\\server\printer", if local printer just the printer name.
|
|
//
|
|
// returns:
|
|
// S_OK on success, or OLE2 error otherwise
|
|
HRESULT CreatePrinterPIDL(HWND hwnd, LPCTSTR pszPrinterName, IShellFolder **ppLocalPrnFolder, LPITEMIDLIST *ppidlPrinter);
|
|
|
|
// loads a popup menu
|
|
HMENU LoadPopupMenu(HINSTANCE hInstance, UINT id, UINT uSubOffset = 0);
|
|
|
|
// initializes enum printer's autocomplete
|
|
HRESULT InitPrintersAutoComplete(HWND hwndEdit);
|
|
|
|
// helpers for the Enum* idioms
|
|
enum { ENUM_MAX_RETRY = 5 };
|
|
HRESULT EnumPrintersWrap(DWORD dwFlags, DWORD dwLevel, LPCTSTR pszName, BYTE **ppBuffer, DWORD *pcReturned);
|
|
HRESULT GetJobWrap(HANDLE hPrinter, DWORD JobId, DWORD dwLevel, BYTE **ppBuffer, DWORD *pcReturned);
|
|
|
|
// enumerates the shared resources on a server, for more info see SDK for NetShareEnum API.
|
|
HRESULT NetAPI_EnumShares(LPCTSTR pszServer, DWORD dwLevel, BYTE **ppBuffer, DWORD *pcReturned);
|
|
}
|
|
|
|
// utility functions
|
|
HRESULT LoadXMLDOMDoc(LPCTSTR pszURL, IXMLDOMDocument **ppXMLDoc);
|
|
HRESULT CreateStreamFromURL(LPCTSTR pszURL, IStream **pps);
|
|
HRESULT CreateStreamFromResource(LPCTSTR pszModule, LPCTSTR pszResType, LPCTSTR pszResName, IStream **pps);
|
|
HRESULT GetCurrentThreadLastPopup(HWND *phwnd);
|
|
HRESULT PrinterSplitFullName(LPCTSTR pszFullName, TCHAR szBuffer[], int nMaxLength, LPCTSTR *ppszServer,LPCTSTR *ppszPrinter);
|
|
|
|
// generate proper HRESULT from Win32 last error
|
|
inline HRESULT
|
|
CreateHRFromWin32(DWORD dwError = GetLastError())
|
|
{
|
|
return (ERROR_SUCCESS == dwError) ? E_FAIL : HRESULT_FROM_WIN32(dwError);
|
|
}
|
|
|
|
inline HRESULT
|
|
SafeGetModuleFileName(HMODULE hModule, LPTSTR lpBuffer, UINT nBufferLength)
|
|
{
|
|
DWORD cch = GetModuleFileName(hModule, lpBuffer, nBufferLength);
|
|
|
|
//
|
|
// Make sure the buffer is zero terminated.
|
|
//
|
|
lpBuffer[nBufferLength-1] = 0;
|
|
|
|
//
|
|
// Check if the buffer is large enough or we have truncation.
|
|
//
|
|
return (0 == cch) ? CreateHRFromWin32() :
|
|
(cch >= nBufferLength) ? CreateHRFromWin32(ERROR_INSUFFICIENT_BUFFER) : S_OK;
|
|
}
|
|
|
|
LONG COMObjects_GetCount();
|
|
|
|
#ifdef _GDIPLUS_H
|
|
// gdiplus utility functions
|
|
HRESULT Gdiplus2HRESULT(Gdiplus::Status status);
|
|
HRESULT LoadAndScaleBmp(LPCTSTR pszURL, UINT nWidth, UINT nHeight, Gdiplus::Bitmap **ppBmp);
|
|
HRESULT LoadAndScaleBmp(IStream *pStream, UINT nWidth, UINT nHeight, Gdiplus::Bitmap **ppBmp);
|
|
#endif // endif _GDIPLUS_H
|
|
|
|
// include the implementation of the template classes here
|
|
#include "tmplutil.inl"
|
|
|
|
#endif // endif _TMPLUTIL_H
|
|
|