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

DLL 非常简单!第三部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (99投票s)

2004年9月30日

2分钟阅读

viewsIcon

238247

downloadIcon

5890

本文档描述了如何使用 DEF 文件创建 DLL 并使用它。

引言

在“DLL 简单!”系列文章的第三部分中,我将描述如何使用 DEF 文件创建 DLL。什么是 DEF 文件?它是一个模块定义 (*.def) 文件,是一个文本文件,包含一个或多个模块语句,描述了 DLL 的各种属性,包括

LIBRARY 语句 语句将 DEF 文件标识为属于 DLL
EXPORTS 语句 列出 DLL 导出的函数名称
DESCRIPTION 语句 描述 DLL 的用途(可选)
LIBRARY      "DefExported"
DESCRIPTION  'DefExported For Present in CodeProject'
EXPORTS
   Multiply @1

如何使用 DEF 文件构建 DLL

  1. 运行 VC++。
  2. 选择 文件>新建。
  3. 在对话框中,选择“MFC AppWizard (DLL)”并命名它,例如 DefExported
  4. 声明一个成员函数
    public:
     int Multiply(int PartOne,int PartTwo);
     CDefExportedApp();
  5. 然后定义它
    int CDefExportedApp::Multiply(int PartOne, int PartTwo)
    {
     return PartOne*PartTwo;
    }
  6. 在“文件视图”选项卡中,单击“源文件”并双击 DefExported.def.
  7. EXPORT 语句之后,输入 [函数名称] @[数字],如下所示
    LIBRARY      "DefExported"
    DESCRIPTION  'DefExported For Present in CodeProject'
    EXPORTS
     ; Explicit exports can go here
     Multiply @1
  8. 单击“生成”按钮。
  9. 将 DLL 从烤箱中取出!!

如何使用 DLL

要动态使用 DLL,有三个简单的 API 函数

  • LoadLibrary ( [DLL 的路径] ) 将 DLL 加载到进程地址空间,并返回指向 DLL 的句柄。
  • GetProcAddress ( [已加载的库] , [函数名称] )
    返回一个函数的句柄,以便在您的应用程序中使用它。
  • FreeLibrary( [已加载 DLL 的句柄] )
    释放加载 DLL 时分配的内存。
  1. 运行 VC++。
  2. 从菜单中选择 文件>新建。
  3. 在对话框中,选择“MFC AppWizard (EXE)”并命名它,例如 DynamicLoad.
  4. 选择“基于对话框”并单击“完成”按钮。
  5. 在对话框上放置一个按钮控件,然后双击它以创建其单击事件。
  6. 在键入按钮单击 (BN_CLICKED) 事件的代码之前,我们必须根据上面导出的函数的参数定义一个新的函数指针,参数数量正确。
    typedef int (CALLBACK* LPFNMLTPLY)(int, int);
    

    Sometimes you have to convert some variable types. For more information about this conversion, see Microsoft Support Article ID: Q117428.

  7. 输入按钮单击事件的代码
    HINSTANCE hClcltr=LoadLibrary("DefExported.dll");
    LPFNMLTPLY lpfnMuliply;
    lpfnMuliply = (LPFNMLTPLY)GetProcAddress(hClcltr,"Multiply");
  8. 现在我们可以通过调用 lpfnMultiply 并存储返回值来使用 Multiply 函数。
    m_Rslt=lpfnMuliply(m_PartOne,m_PartTwo);
  9. 完成使用库后,必须调用 FreeLibrary API 以释放从 LoadLibrary 方法分配的内存。
    FreeLibrary( hClcltr );

历史

  • 2004 年 9 月 30 日 -- 发布原始版本
© . All rights reserved.