CComPtr
or Boost smart pointers to help with reference counting of COM/Direct3D objects, like vertex/index buffers, textures, etc. (see here for a good overview on the topic).However
CComPtr
requires ATL and doesn't work with VS Express.An alternative is to use _com_ptr_t which also is available in VS Express, with a little macro help you can wrap things up quite nicely:
#include "comip.h" #define DECLARE_COM_REF(x) typedef \ _com_ptr_t< _com_IIID< IDirect3D##x##9, &IID_IDirect3D##x##9 > > \ x##Ref; DECLARE_COM_REF(VertexBuffer); DECLARE_COM_REF(IndexBuffer); DECLARE_COM_REF(CubeTexture); // etc.
With this you can then create some nice wrapper classes like this e.g.:
class VertexBuffer : public VertexBufferRef { public: VertexBuffer(IDirect3DVertexBuffer9* vertex_buffer = NULL) { Attach(vertex_buffer); } void* lock(UINT offset, UINT size, DWORD flags) { IDirect3DVertexBuffer9* p = GetInterfacePtr(); assert(NULL != p); void* mem = 0; p->Lock(offset, size, &mem, flags); assert(NULL != mem); return mem; } void unlock() { GetInterfacePtr()->Unlock(); } };