环境:
有一个名为ComDll.dll的动态库,导出了一个名为"CreateFastString"的函数,函数返回与IFastString所指向的vptr兼容的指针。(《COM本质论》中的例子)
实现:
static IFastString * (*pfn)(const char *psz) = 0;
if (!pfn)
{
const TCHAR szDll[] = _T("ComDll.dll");
const CHAR szFn[] = "CreateFastString";
HINSTANCE hDll = LoadLibrary(szDll);
if (hDll)
{
*(FARPROC*)&pfn = GetProcAddress(hDll,szFn);
}
}
说明:
主要用到一个技术和两个函数:
1、使用函数指针以及函数指针之间的类型转换;
2、LoadLibrary()加载动态库的函数;
3、GetProcAddress()从已加载的动态库中找指定名称的函数的入口地址
好处:
1、如果程序执行部分没有调用到动态库中的函数,那么,动态库就不会被加载到内存中,节省空间,同时也能加快程序的初始化,加快进程地址空间的初始化和保留更多的地址空间。
2、如果加载动态库失败,或者获取函数入口地址失败,都能够在程序运行时发现,可以避免程序因动态库而出错,是程序在没有动态库的情况下也能正常运行,就像Windows使用可选的组件一样,例如当WinSock动态库不存在时,系统同样能够正常运行。