请教怎么像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();
....
在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();
....