65.9K
CodeProject 正在变化。 阅读更多。
Home

包装 DLL 函数的类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (32投票s)

2002年6月26日

1分钟阅读

viewsIcon

320531

downloadIcon

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日 - 初始修订版

© . All rights reserved.