由dll导出的lib文件: 包含了每一个dll导出函数的符号名和可选择的标识号以及dll文件名,不含有实际的代码(这里的lib文件和静态库是不一样的),其中的导出导入函数都 是跳转指令,直接跳转到DLL中的位置。基于这样一句话可以看出在编译一个程序的时候,编译器先通过头文件知道要使用函数的格式,然后在lib文件中(这 里的lib文件名是可以随便更换的)查找这个函数在dll文件中的具体地址,从而知道这个函数的入口点。其次由于lib包含了dll文件名,所以在执行 exe程序的时候,dll文件的名称是不能更改的。

一、生成DLL

1.      
新建DLL工程

生成DLL可以多种方法,这里介绍一种。在VS中,新建一个空的项目,选Win32
Console Application,新建完后修改工程属性:把生成EXE改为生成DLL

2.      
源代码:

ShowInfo.h

  1. #ifdef SHOWINFO_EXPORTS
  2. #define SHOWINFO_API __declspec(dllexport)
  3. #else
  4. #define SHOWINFO_API __declspec(dllimport)
  5. #endif
  6. extern "C" SHOWINFO_API void fnShowInfo(void);

ShowInfo.c:

  1. #define SHOWINFO_EXPORTS
  2. #include "ShowInfo.h"
  3. #include <stdio.h>
  4. SHOWINFO_API void fnShowInfo(void)
  5. {
  6. printf("Crab\n");
  7. }


3.      
编译连接,生成dll.dll文件

ps:

1.
特别要注意要在ShowInfo.c文件的开头加上#define SHOWINFO_EXPORTS

2.
在ShowInfo.h中声明函数的时候要加上 extern "C", 因为如果该函数可能会被c++ 程序调用。

二、       
使用DLL


1.      
新建工程

新建一个Win32 Console
Application,选择空的工程。


2.      
源代码:

main.cpp

#include <windows.h>

#include <iostream>

using namespace std;



typedef

  void   (*DllFn)(void);

int main()

{

    
HINSTANCE   
hInst = LoadLibrary(TEXT("ShowInfo.dll"));

    
if(hInst)

    
{

       
DllFn a =(DllFn) GetProcAddress(hInst,"fnShowInfo");

       
if(a)

           
a();

       
else

           
cout<<"ERROR on
GetProcAddress"<<endl;

       
FreeLibrary(hInst);

    
}

    
else

       
cout<<"Error on Load
library"<<endl;

}



ps:

a. 用 LoadLibrary 可能会出现 “不能将参数 1 从‘const char
[13]’转换为‘LPCWSTR’”的错误,这时需要用到TEXT()函数。

b.
由于用了LoadLibrary函数,所以dll的文件名可以改变,只要文件名和LoadLibrary中的参数一样,就可以了。

 

3.       将上面工程生成的dll.dll文件复制到此工程的目录下,保证源文件与DLL文件在同一目录下。如果生成的EXE文件要直接运行,则要保证EXE文件与DLL文件在同一目录下。

4.      
编译连接,执行。

最新文章

  1. GJM:用C#实现网络爬虫(一) [转载]
  2. backslash and newline separated by space
  3. SqlServer2008R2安装步骤
  4. jQuery慢慢啃之回调(十三)
  5. 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)
  6. Delphi会自动初始化全局变量和类成员变量,但不初始化局部变量
  7. Chapter 8. Introduction to multi-project builds 多工程构建介绍
  8. RequireJS 入门指南
  9. 在CDockablePane中嵌入对话框
  10. leetcode实战
  11. Java并发编程-并发工具类及线程池
  12. Python自定义Module中__init__.py文件介绍
  13. win10配置labelImg
  14. Android的事件分发机制
  15. [转帖]三大运营商2G/3G/4G频率分配和网络制式
  16. loj#2721. 「NOI2018」屠龙勇士
  17. CRM - 销售与客户
  18. bzoj 3289 莫队 逆序对
  19. LightOJ 1203--Guarding Bananas(二维凸包+内角计算)
  20. 【转】Haml 这货是啥? 附参考

热门文章

  1. Java入门(7)——循环和debug 调试
  2. HTML图像
  3. asp.net core策略授权
  4. jmeter性能测试 套路二
  5. 为测试赋能,腾讯WeTest探索手游AI自动化测试之路
  6. basepath的作用 (转)
  7. 垃圾收集器Serial 、Parallel、CMS、G1
  8. unix下的文件和目录详解以及操作方法
  9. SNS团队第一次站立会议(2017.04.22)
  10. 团队作业8----第二次项目冲刺(Beta阶段) 第七天