AddRef, Release и QueryInterface - это члены класса IUnknown. Советую почитать про технологию COM - тогда станет понятней. Если не вызывать Release, то возможны проблемы с памятью, поэтому рекомендую сделать так:
Код:
typedef struct ControlInterface
{
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
IUnknown * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )(
IUnknown * This);
ULONG ( STDMETHODCALLTYPE *Release )(
IUnknown * This);
bool __stdcall (*f_check)(void *This);
bool __stdcall (*f_user)(void *This, DWORD dwType, void* proc, DWORD User);
bool __stdcall (*f_rem)(void *This, DWORD dwType, void* proc);
} *pControlInterface;
...
// попользовались
interface->Release(my_class);
но если компилятор всё-же поддерживает виртуальные функции, то лучше не париться и сделать по-человечески:
Код:
struct ControlInterface : IUnknown
{
bool __stdcall f_check();
bool __stdcall (DWORD dwType, void* proc, DWORD User);
bool __stdcall (DWORD dwType, void* proc);
} *pControlInterface;
...
// попользовались
interface->Release();