15.7 加载动态链接库

如果你想要使用位于动态链接库中的函数,你需要使用wxDynamicLibrary类.使用方法是:在其构造函数或者Load函数中传递动态链接库的文件名,如果你不希望wxWidgets自动增加类似.dll(windows)或者.so(linux)这样的扩展名,还需要传递 wxDL_VERBATIM参数.如果加载成功,就可以使用GetSymbol函数通过函数名使用其中的函数了.下面的例子演示了怎样加载和使用 windows的标准控件动态链接库:

#include "wx/dynlib.h"
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(icex);
icex.dwICC = ICC_DATE_CLASSES;
// 加载comctl32.dll
wxDynamicLibrary dllComCtl32(wxT("comctl32.dll"), wxDL_VERBATIM);
// 定义ICCEx_t类型
typedef BOOL (WINAPI *ICCEx_t)(INITCOMMONCONTROLSEX *);
// 获取InitCommonControlsEx符号表
ICCEx_t pfnInitCommonControlsEx =
    (ICCEx_t) dllComCtrl32.GetSymbol(wxT("InitCommonControlsEx"));
// 调用获取的函数.
if ( pfnInitCommonControlsEx )
{
    (*pfnInitCommonControlsEx)(&icex);
}

wxDYNLIB_FUNCTION宏使得上面代码中的GetSymbol行更为简洁:

wxDYNLIB_FUNCTION( ICCEx_t, InitCommonControlsEx, dllComCtl32 );

wxDYNLIB_FUNCTION使得你只需要使用一次返回值类型作为其第一个参数,它将创建一个对应的变量,变量名由函数名和pfn前缀组成.

如果动态链接库被成功加载,它将在对应的wxDynamicLibrary对象被释放的时候,在其析构函数中自动被卸载,如果你希望在 wxDynamicLibrary被释放以后继续使用相应的函数,你应该调用首先调用wxDynamicLibrary的Detach函数.