您的位置:首页 > 其它

调用不同dll中的同一函数

2012-07-19 11:00 281 查看
就是使用LoadLibrary取得相应的dll句柄,然后使用GetProcAddress取得相应函数接口的入口地址,

通过函数指针调用就行了。可以使用Dependency Walk 工具查看dll中有哪些接口。

我和我的组长各写了一个,高下立断。

主要我没有判断NULL值,需要注意。

我的代码:

class DX8Interface
{
typedef HRESULT (WINAPI * DX8_D3DXCreateSprite)(LPDIRECT3DDEVICE8, LPD3DXSPRITE *);
public:
static HRESULT WINAPI D3DXCreateSprite(LPDIRECT3DDEVICE8 pDevice, LPD3DXSPRITE* ppSprite);
static bool Initial();
static bool Free();
private:
static HMODULE            m_hDX8Module;
static DX8_D3DXCreateSprite m_pfD3DXCreateSprite;
};
DX8Interface::DX8_D3DXCreateSprite DX8Interface::m_pfD3DXCreateSprite = NULL;
HMODULE DX8Interface::m_hDX8Module = NULL;
HRESULT WINAPI DX8Interface::D3DXCreateSprite(LPDIRECT3DDEVICE8 pDevice, LPD3DXSPRITE* ppSprite)
{
if(NULL == m_pfD3DXCreateSprite) Initial();
return m_pfD3DXCreateSprite(pDevice, ppSprite);
}
bool DX8Interface::Initial()
{
m_hDX8Module = ::LoadLibrary(_T("D3DX8ab.dll"));
m_pfD3DXCreateSprite = (DX8_D3DXCreateSprite)GetProcAddress(m_hDX8Module, "D3DXCreateSprite");

return true;
}
bool DX8Interface::Free()
{
return ::FreeLibrary(m_hDX8Module);
}


leader代码:

class DX9Interface
{
typedef HRESULT (WINAPI *D3DXCreateSpriteFun)(LPDIRECT3DDEVICE9, LPD3DXSPRITE*);
public:
static bool Initial()
{
m_hModule = LoadLibrary(_T("D3dx9_42.dll"));
if(m_hModule == NULL)
{
TRACEE(_T("Load D3dx9_42.dll failed."));
return false;
}

m_pD3DXCreateSprite = (D3DXCreateSpriteFun)GetProcAddress(m_hModule, "D3DXCreateSprite");
if(m_pD3DXCreateSprite == NULL)
{
TRACEE(_T("Get D3DXCreateSpriteFun for D3dx9_42.dll failed."));
return false;
}

return true;
}

static void Destory()
{
m_pD3DXCreateSprite = NULL;

if(m_hModule)
{
FreeLibrary(m_hModule);
m_hModule = NULL;
}
}

static HRESULT D3DXCreateSprite(LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE* ppSprite)
{
if(m_pD3DXCreateSprite == NULL)
{
if(!Initial())
{
return S_FALSE;
}
}
return m_pD3DXCreateSprite(pDevice, ppSprite);
}
private:
static HMODULE m_hModule;
static D3DXCreateSpriteFun m_pD3DXCreateSprite;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: