包装 DLL 函数的类






4.76/5 (32投票s)
2002年6月26日
1分钟阅读

320531

2493
使使用 dll 函数更加容易。
引言
我的项目需要管理大量的 DLL。它们都导出相同的函数集。这些 DLL 在编译时与主项目不链接。我们称它们为插件。这些插件用于扩展主程序的功能。一旦它们被复制到程序目录中,程序就可以使用它们,如果从目录中删除它们,主程序仍然可以正常工作,只是某些功能无法使用。
由于这些 DLL 在主程序编译时不可用,我们必须使用 LoadLibrary、GetProcAddress 和 FreeLibrary 来使用这些 DLL。这真的很枯燥!我需要一个类来简化这项工作。事实上,这些 DLL 看起来就像类(它们都有相同的接口:一组函数)。使用一个类来封装这些 DLL 是合理的。
这就是 CDLLModule 类。这个类仅用于派生。让我们先看看如何使用它。假设你有一个导出两个函数的 DLL,如下所示
int WINAPI GetEngine(char *szEngineType, char *szEngineVersion); int WINAPI StartEngine(HWND hWnd);
包装类如下所示
class CMyClass : public CDLLModule { DECLARE_DLL_FUNCTION(int, WINAPI, GetEngine, (char *, char *)) DECLARE_DLL_FUNCTION(int, WINAPI, StartEngine, (HWND)) BEGIN_DLL_INIT() INIT_DLL_FUNCTION(int, WINAPI, GetEngine, (char *, char *), "GetEngine") INIT_DLL_FUNCTION(int, WINAPI, StartEngine, (HWND), "StartEngine") END_DLL_INIT() };
然后我们可以这样使用它
CMyClass module; module.Init("MyDLL.dll"); module.GetEngine(m_str1, m_str2); module.StartEngine(m_hWnd);
我应该更详细地解释一下,但我真的不擅长英语。无论如何,代码非常简单,只有 64 行,包括注释。我认为它很有用,希望你也是这么认为的。
最后一点。在调用之前检查函数是否有效是一个好主意。换句话说,如果你不确定 DLL 是否正确导出了所有函数,请像这样调用它
if (module.GetEngine)
module.GetEngine(m_str1, m_str2);
尽情享受 :)
修订历史
2002年6月26日 - 初始修订版