请教怎么像D3D那样简单的获得COM接口

请问如何像D3D那样简单的获得COM接口
在D3D中使用COM接口很简练
LPDIRECT3D9                           g_pD3D               =   NULL;   //   Used   to   create   the   D3DDevice
        if(   NULL   ==   (   g_pD3D   =   Direct3DCreate9(   D3D_SDK_VERSION   )   )   )
                return   E_FAIL;
然后在VOID   Cleanup()中释放
        if(   g_pD3D   !=   NULL)
                g_pD3D-> Release();

程序中并没有出现::CoUninitialize();
见tutorial   CreateDevice

试图封装一下我的COM
//#include   "../testcom/testcom.h "
#include   "../testcom/testcom_i.c "
#include   <tchar.h>
#include   <exception>
IFun*   WINAPI   GetInterface()
{
::CoInitialize(   NULL   );
IUnknown   *   pUnk   =   NULL;
IFun   *   pFun   =   NULL;
HRESULT   hr;
hr   =   ::CoCreateInstance(
CLSID_Fun,
NULL,
CLSCTX_INPROC_SERVER, //   以进程内组件   DLL   方式加载
IID_IUnknown, //   想取得   IUnknown   接口指针
(LPVOID   *)   &pUnk);
if(   FAILED(   hr   )   ) std::exception(   "没注册吧? "   );
hr   =   pUnk-> QueryInterface( //   从   IUnknown   得到其它接口指针
IID_IFun, //   想要取得   IFun   接口指针
(LPVOID   *)&pFun   );
if(   FAILED(   hr   )   ) std::exception(   "居然没有接口? ");
// ::CoUninitialize();//这里我不知道该如何处理
return   pFun;
}

希望像D3D中那样调用和释放
#include   "../server/A.h "
int   _tmain(int   argc,   _TCHAR*   argv[])
{
PFun   p   =   GetInterface();
long   c;
p-> Add(1,2,&c);
p-> Release();
p=NULL;
return   0;
}

我现在的困惑是::CoUninitialize();
为什么在D3D的tutoral程序中没有这一项,它是一定要的啊.
在D3D中是如何实现调用的呢?

------解决方案--------------------
class init
{
public:
init(){::CoUninitialize();}
};
init _init;

int main()
{
..直接使用com
}

------解决方案--------------------
简单COM模型就是COM最原始,最基础的东西.它不涉及什么进程,套间之类的概念.相当于给你一个虚基类的指针.
就像下面:
interface ibase {...};
class instance : public ibase {...};
ibase* getinstance() {
return new instance();
}

ibase *ptr = getinstance();
....