使用Def文件导出Dll文件

 模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件。如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 .def 文件。.def 文件必须至少包含下列模块定义语句:

  • 文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。

  • EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。使用符号时外部调用程序可以使用函数名称和序号加载函数。

  步骤:

  1. 新建一个win32控制台项目,File->New->Project,选择Win32控制台项目,在“应用程序设计”中选择"Dll","空项目"

  2.在工程中添加一个.cpp文件,本文为DllDefTest.cpp,并输入如下代码:

     int __stdcall Add(int numa, int numb)
    {
       return (numa + numb);
    }

    int __stdcall Sub(int numa, int numb)
   {
        return (numa - numb);
   }

 3.在工程中添加一个.def文件,本文为DllDefTest.def,输入如下代码:

  LIBRARY DllDefTest
  EXPORTS 
  Add @ 1
  Sub @ 2

  也可以为如下内容,即函数名称不包括序号

  LIBRARY DllDefTest
  EXPORTS  
  Add
  Sub

  这两者的区别只是在外部导入函数时有所不同,下面会具体介绍。

 4.编译工程,就可以在Debug中看到DllDefTest.lib和DllDefTest.dll。

  到此DLL的制作已经完成,下面给出一个测试程序,看看如何使用该Dll。

  建立一个win32控制台项目,在“应用程序设计”中选择“控制台应用程序”和“空项目”,在工程中添加test.cpp文件,并输入如下代码:本文给出的测试程序是采用显示链接的方式调用该DLL的,当然也可以采用隐式链接的方式调用,如果采用隐式链接必要要有头文件。

  #include <iostream>
  #include <windows.h>

  using namespace std;

  typedef int (__stdcall *FUN)(int, int);
  HINSTANCE hInstance;
  FUN   fun;

  int main()
  {
     hInstance = LoadLibrary("DllDefTest.dll");
     if(!hInstance)
     cout << "Not Find this Dll" << endl;
     fun = (FUN)GetProcAddress(hInstance, "Add");

     //当在Def文件中指定函数序号时,可以通过序号导出,否则只能通过函数名称导出
     //fun = (FUN)GetProcAddress(hInstance, MAKEINTRESOURCE(2));

     if (!fun)
    {
       cout << "not find this fun" << endl;
    }
    cout << fun(1, 2) << endl;
    FreeLibrary(hInstance);
    return 0;
 }

注意,需要将刚才生成的DllDefTest.dll文件拷贝到测试工程目录下。 

 

posted @ 2014-08-20 17:36  QQ76211822  阅读(798)  评论(0编辑  收藏  举报