template <typename T>
class DynamicFn
{
public:
DynamicFn(const char* strDllFilePathName, const char* strFnName)
{
m_hDll = LoadLibrary(strDllFilePathName);
if (NULL == m_hDll)
{
throw std::exception("加载dll失败!");
}
m_ptrFn = reinterpret_cast<T>(GetProcAddress(m_hDll, strFnName));
if (NULL == m_ptrFn)
{
throw std::exception("从dll获取导出函数失败!");
}
}
~DynamicFn()
{
FreeLibrary(m_hDll);
}
T operator*()
{
return m_ptrFn;
}
protected:
HMODULE m_hDll;
T m_ptrFn;
private:
DynamicFn(const DynamicFn& cOther);
DynamicFn& operator= (const DynamicFn& cOther);
};
int main(int argc, char* args[])
{
typedef HMONITOR (WINAPI *_MonitorFromWindow_proto)(HWND, DWORD);
DynamicFn<_MonitorFromWindow_proto> _MonitorFromWindow("user32.dll", "MonitorFromWindow");
return 0;
}