此代码构造的说明

时间:2011-07-28 11:45:42

标签: c++ direct3d game-engine

我有这样的代码(它是在DLL文件中实现的接口函数的声明 - 它来自书籍 - 课程PTR 3D游戏引擎编程):

extern "C"
{
    HRESULT CreateRenderDevice(HINSTANCE hDLL, ZFXRenderDevice **pInterface); 
    typedef HRESULT (*CREATERENDERDEVICE) 
                        (HINSTANCE hDLL, ZFXRenderDevice **pInterface);
    HRESULT ReleaseRenderDevice(ZFXRenderDevice **pInterface); 
    typedef HRESULT(*RELEASERENDERDEVICE) 
                        (ZFXRenderDevice **pInterface);
}

并且它的使用喜欢这个

CREATERENDERDEVICE _CreateRenderDevice = 0;
HRESULT hr; // pointer to DLL function ‘CreateRenderDevice’
_CreateRenderDevice = (CREATERENDERDEVICE) 
                        GetProcAddress(m_hDLL,“CreateRenderDevice”);

if ( !_CreateRenderDevice ) 
    return E_FAIL; // call DLL function to create the device

hr = _CreateRenderDevice(m_hDLL, &m_pDevice);

我理解它是从DLL中提取函数,但有人可以解释我这部分代码吗?它的构造是什么(宏?)以及它是如何工作的?

typedef HRESULT (*CREATERENDERDEVICE)
                        (HINSTANCE hDLL, ZFXRenderDevice **pInterface);

以及

typedef HRESULT(*RELEASERENDERDEVICE)
                        (ZFXRenderDevice **pInterface);

及其使用

_CreateRenderDevice = (CREATERENDERDEVICE)
                                  GetProcAddress(m_hDLL,“CreateRenderDevice”);

3 个答案:

答案 0 :(得分:3)

typedef HRESULT (*CREATERENDERDEVICE) (HINSTANCE hDLL, ZFXRenderDevice **pInterface); 

是函数指针的typedef声明(指向函数的指针)。

在此typedef声明之后。

CREATERENDERDEVICE _CreateRenderDevice;

声明一个函数指针,该函数指向返回HRESULT并带有两个参数HINSTANCE&的函数。 ZFXRenderDevice **

_CreateRenderDevice = (CREATERENDERDEVICE) GetProcAddress(m_hDLL,“CreateRenderDevice”);

将函数GetProcAddress的地址指定给函数指针CreateRenderDevice

答案 1 :(得分:2)

也许你应该看看here 这是对函数指针的一个小介绍,应该回答你的问题。

答案 2 :(得分:0)

基本上是宣言

typedef HRESULT (*CREATERENDERDEVICE) (HINSTANCE hDLL, ZFXRenderDevice **pInterface);

只能告诉编译器函数是什么样的。为了能够调用该函数,您的代码需要能够告诉该函数的位置。所以要做到这一点,你的代码首先使用LoadLibrary()来加载dll以获取dll的hInstance。然后使用GetProcAddress获取具有特定名称的导出函数的地址,并将其分配给上面声明的函数指针类型。这个函数指针足以调用指定的函数。