目的是把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接口尚未编写)
posted on 2008-11-11 09:27
正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(157)
评论(0) 编辑 收藏 引用 所属分类:
天地之灵