windows-nt/Source/XPSP1/NT/ds/security/passport/include/bstrdebug.h
2020-09-26 16:20:57 +08:00

82 lines
2.4 KiB
C++

#ifndef _BSTRDEBUG_H
#define _BSTRDEBUG_H
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// BSTR debugging.
// GIVEAWAY is used when someone else will free it
// TAKEOVER is used when you get one you should be freeing
/*
#ifdef MEM_DBG
#define FANDL __FILE__,__LINE__
#define ALLOC_BSTR(x) g_allocs.track(SysAllocString(x),FANDL)
#define ALLOC_BSTR_LEN(x,y) g_allocs.track(SysAllocStringLen(x,y),FANDL)
#define ALLOC_BSTR_BYTE_LEN(x,y) g_allocs.track(SysAllocStringByteLen(x,y),FANDL)
#define ALLOC_AND_GIVEAWAY_BSTR(x) SysAllocString(x)
#define ALLOC_AND_GIVEAWAY_BSTR_LEN(x,y) SysAllocStringLen(x,y)
#define ALLOC_AND_GIVEAWAY_BSTR_BYTE_LEN(x,y) SysAllocStringByteLen(x,y)
#define GIVEAWAY_BSTR(x) g_allocs.release(x,FANDL)
#define TAKEOVER_BSTR(x) g_allocs.track(x,FANDL)
#define FREE_BSTR(x) { g_allocs.release(x,FANDL); SysFreeString(x);}
#else
*/
#define ALLOC_BSTR(x) SysAllocString(x)
#define ALLOC_BSTR_LEN(x,y) SysAllocStringLen(x,y)
#define ALLOC_BSTR_BYTE_LEN(x,y) SysAllocStringByteLen(x,y)
#define ALLOC_AND_GIVEAWAY_BSTR(x) SysAllocString(x)
#define ALLOC_AND_GIVEAWAY_BSTR_LEN(x,y) SysAllocStringLen(x,y)
#define ALLOC_AND_GIVEAWAY_BSTR_BYTE_LEN(x,y) SysAllocStringByteLen(x,y)
#define GIVEAWAY_BSTR(x)
#define TAKEOVER_BSTR(x)
#define FREE_BSTR(x) SysFreeString(x)
//#endif
#include "BstrHash.h"
#pragma warning(disable:4786)
class bstrAllocInfo
{
public:
bstrAllocInfo(LPSTR f, int i, ULONG n) : file(f), line(i), num(n) {};
LPSTR file;
int line;
ULONG num; // Which allocation number is this...
};
typedef CGenericHash<long,bstrAllocInfo*> BSTRLEAKMAP;
class CBstrDebug
{
public:
CBstrDebug();
virtual ~CBstrDebug();
// Usage: track(SysAllocString(L"newbstr"), __FILE__, __LINE__)
// If it leaks, the message will be displayed (as file and line#)
// For more reasonable performance, the message must be a static,
// i.e. we don't free it.
BSTR track(BSTR mem, LPSTR message, int line);
void release(BSTR mem, LPSTR message, int line);
protected:
BSTRLEAKMAP m_allocs;
ULONG m_numAllocs;
};
/*
#ifdef MEM_DBG
extern CBstrDebug g_allocs;
extern ULONG g_breakOnBstrAlloc;
#endif
*/
#endif