我有这样的代码(它是在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”);
答案 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获取具有特定名称的导出函数的地址,并将其分配给上面声明的函数指针类型。这个函数指针足以调用指定的函数。