Chinaunix首页 | 论坛 | 博客
  • 博客访问: 319996
  • 博文数量: 60
  • 博客积分: 2781
  • 博客等级: 少校
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-23 16:42
文章分类

全部博文(60)

文章存档

2011年(33)

2010年(27)

分类: C/C++

2011-03-02 20:28:44

存在两种方法从DLL中导出函数:

l  隐含地导出(implicitly):大多数情况都采用此种方法,因为简单易操作。

创建两个工程,一个制作DLLCreateDLL),另一个使用DLL的导出函数(UseDLL)。

例如:CreateDLL中声明且定义了一个导出函数 

  1. __declspec(dllexport) void letterList()

此工程成功build后会生成 CreateDLL.dll 和 CreateDLL.lib 两个文件,其中CreateDLL.dll就是我们所需要的.dll文件,至于.lib文件有什么作用,继续往下看。

    在UseDLL.cpp中,主函数代码如下:

  1. #include "CreateDLL.h"
  2. #include ...

  3. int main()
  4. {
  5.     ...
  6.     letterList(); // exported from CreateDLL.dll
  7.     ...
  8.     return 0;
  9. }

编译UseDLL.cpp后,系统提示"unresolved external symbol "void __cdecl letterList(void)"错误,原因是未解

析的外部符号letterList()。为什么会无解析呢?我们已经包含了 CreateDLL.h 头文件了。好吧,我们假设编

译通过生成了想要的UseDLL.exe文件,那么运行该程序并与动态链接库CreateDLL.dll进行交互,程序如何

到.dll文件中的 letterList() 函数呢?所以之前的编译错误可以理解为没有给链接器提供详细的函数地址信

息,函数的详细地址信息在哪里呢?就在与CreateDLL.dll同时生成的CreateDLL.lib文件中,该.lib文件称为

导入库(import library),链接器linker将其静态链接进.exe文件中,那么.exe在运行时就能根据.lib信息在.dll

中精确定位letterList()函数。综上可知,UseDLL.cpp文件在编译的时候需要额外的库依赖,即Additional 

dependencies,在代码里如何反应呢?首先我们将CreateDLL.lib和CreateDLL.dll文件放入UseDLL工程目

下,然后更新代码:

  1. #include "CreateDLL.h"
  2. #include ...

  3. #pragma comment(lib, "CreateDLL.lib")
  
 int main(){...}

若要发布程序,须将exe和dll打包发布。

l  显示地导出(explicitly):当有特殊需求的时候采用此种方法,此种方法需要调用三个系统函数:

  1. /*参数省略*/
  2. LoadLibrary();

  3. GetProcAddress();

  4. FreeLibrary();

更多情况请参考微软官方说明:

阅读(1683) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~