11月11日_通用外部库管理Framework_By Gardon

11月11日_通用外部库管理Framework_By Gardon

目的是把DX9、DX10、OpenGL、Software等图形库封装到一个统一的图形接口,把DInput、WINAPI的输入控制封装到一个统一的输入接口,在用户机器上自动选择一个可用的接口使用(譬如Vista默认选择DX10,XP默认选择DX9等)。如果以后有必要,也只需要再定义一个接口,就可以把任何的同功能的多个库封装到一个统一的接口,并获取到一个默认的接口使用。另外,当用户机器上没有可用库的时候,可以“优雅”的提示用户,而不是弹出系统默认的“缺少XXX.DLL,程序无法启动”。
主函数:

#include "stdafx.h"

#include "FWBase.h"

[
 module (name="TestFramework")
];

int _tmain(int argc, _TCHAR* argv[])
{
 InitFramework();
 CComPtr<IGraphicsLibrary> pGL;
 if (FAILED(GetDefaultFrameworkLibrary(&pGL)))
 {
  wprintf(L"No default graphics library found.");
  ATLASSERT(0);
  return 1;
 }
 CComBSTR bsGLName;
 if (SUCCEEDED(pGL->GetLibraryName(&bsGLName)))
 {
  wprintf(L"Default graphics library is: %s", (BSTR)bsGLName);
 }

 return 0;
}

接口:

[
 object,
 uuid("914F136A-FCC8-4e1b-9E5D-95797B6DE183")
]
__interface ILibrary : public IDispatch
{
 [id(1), helpstring("Init the library. Return E_FAIL if failed.")]
 HRESULT InitLibrary();
 [id(2), helpstring("Retrieves the name of this library")]
 HRESULT GetLibraryName(BSTR *pbsName);
};

[
 object,
 uuid("9E979A9A-A271-496f-B04E-7A9AE0BAE335")
]
__interface IGraphicsLibrary : public ILibrary
{
   //暂时还什么也没写
};


Framework接口:
HRESULT InitFramework();
HRESULT RegisterFrameworkLibrary(REFIID idLibaryType, ILibrary *pLibrary);
HRESULT GetDefaultFrameworkLibrary(REFIID idLibraryType, ILibrary **ppLibrary);

template <typename Interface, typename ClassType>
HRESULT RegisterFrameworkLibrary();

template <typename LibraryType>
HRESULT GetDefaultFrameworkLibrary(LibraryType **ppLibrary);

运行效果:
On Vista:
Default graphics library is: Direct3D 10 Library
On XP:
No default graphics library found.
(Direct3D 9接口尚未编写)

你可能感兴趣的:(11月11日_通用外部库管理Framework_By Gardon)