当前位置:天才代写 > tutorial > C语言/C++ 教程 > 加载COM的方法

加载COM的方法

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:523

凡是我们都是利用CoCreateInstance或CoGetClassObject得到接口,再通过接口会见他的成员要领。在C++支持下,从来不会有任何问题。可是假如利用Win32模式,纯粹C气势气魄编程,就会呈现问题了。

通过研究我发明其实上述会见方法自己就存在问题。尺度的会见方法,如D3D一样,接口的初始化必需在Com提供的API基本上完成。COM设计者需要提供一个API,像DLL的导出函数一样,供应外部措施挪用。

详细设计:

下面是一个gdi扩展函数库gdiex,GdiexCreate就是建设接口的一个函数,如同Direct3DCreate9一样,挪用这个函数可以立即建设一个接口指针。

在COM内部设计导出函数,如:

HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex)
{
HRESULT hr;
ISaveDDCtl * pCtrl = NULL;

hr = CoCreateInstance( CLSID_SaveDDCtl, NULL, CLSCTX_SERVER, IID_ISaveDDCtl, (void**) &pCtrl);

if(FAILED(hr))
{
 MessageBox(NULL, "GdiexCreate Failed!", "gdiexPS", MB_OK|MB_ICONSTOP);
 return hr;
}

*lplpGdiex = (LPVOID) pCtrl;

return S_OK;
}

该函数可以放在主要cpp文件中。

在导出的头文件(gdiex.h)中作作声明:

HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex);

只要不从头生成COM,这个头文件中城市包括该API。

下来在gdiex.def增加这个API名字,以便外部会见。

EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObjectPRIVATE
DllRegisterServerPRIVATE
DllUnregisterServerPRIVATE
  GdiexCreate

挪用的时候,只需要在工程中包括gdiex.h, 输入gdiex.lib,就可以挪用到这个API

ISaveDDCtl * pCtl = NULL;
CoInitialize( NULL );

hr = GdiexCreate( (LPVOID*) &pCtl );
if(FAILED( hr )) {
return hr;
}
... ...
GdiexFree( (LPVOID) &pCtl ); //gdiex释放API,在gdiex模块中界说。
CoUninitialize();

就是这样,挪用者没有呈现多余的会见,就可以得到接口。并且C/C++都可以很好的事情。

 

    关键字:

天才代写-代写联系方式