由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.      
编译连接,执行。

DLL生成与使用的全过程的更多相关文章

  1. DLL 生成与使用的全过程(2010-01-18 14:50:17)

    转载自 水滴的博客http://blog.sina.com.cn/spiritofwater   个人学习用 转载▼   分类: 技术 由dll导出的lib文件: 包含了每一个dll导出函数的符号名和 ...

  2. C# 利用BarcodeLib.dll生成条形码(一维,zxing,QrCodeNet/dll二维码)

    原文:http://blog.csdn.net/kongwei521/article/details/17588825 首先效果: 一.下载BarcodeLib.dll 下载地址 :http://do ...

  3. C# 利用BarcodeLib.dll生成条形码

    首先效果: 1:首先下载BarcodeLib.dll 下载地址 http://pan.baidu.com/share/link?shareid=2590968386&uk=2148890391 ...

  4. 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件

    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...

  5. C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

    本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...

  6. 【转】C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

    本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...

  7. 由动态库文件dll生成lib库文件

    本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...

  8. python调取C/C++的dll生成方法

    本文针对Windows平台下,python调取C/C++的dll文件. 1.如果使用C语言,代码如下,文件名为test.c. __declspec(dllexport) int sum(int a,i ...

  9. zxing.dll生成条码

    引入zxing.dll using System; using System.Drawing; using ZXing.QrCode; using ZXing; using ZXing.Common; ...

随机推荐

  1. Unix硬链接和符号链接(转)

    首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文 ...

  2. SVG文本

    前面的话 本文将详细介绍SVG文本相关内容 位置属性 在一个SVG文档中,使用<text>元素来设置文本,<text>元素有x.y.dx.dy这四个位置属性 [x和y] 属性x ...

  3. ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置

    在 ASP.NET Core 里扩展 Razor 查找视图目录不是什么新鲜和困难的事情,但 _ViewStart 和 _ViewImports 这2个视图比较特殊,如果想让 Razor 在我们指定的目 ...

  4. javasript校验字符串【正则和其他函数】

    /**javasript校验输入框值只能为数字中文英文和下划线**/function isRegex(s){ var reg=/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/; if (! ...

  5. 关于wamp服务器文件的配置

    有的前端朋友想在手机端看PC端开发的html5页面,这时候会在本地PC下载一个wamp,这时候在PC端输入电脑的IP地址或者是直接输入localhost,可以访问www目录下的文件(开发项目必须放置在 ...

  6. node.js 89行爬虫爬取智联招聘信息

    写在前面的话, .......写个P,直接上效果图.附上源码地址  github/lonhon ok,正文开始,先列出用到的和require的东西: node.js,这个是必须的 request,然发 ...

  7. Selenium八种基本定位方式---基于python

    from selenium import  webdriver driver=webdriver.Firefox() driver.get("https://www.baidu.com&qu ...

  8. java8 去掉 perm 用 Metaspace 来替代

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt266 正如大家所知,JDK 8 Early Access版已经提供下载.这使 ...

  9. Android学习记录:Paint,Canvas和Bitmap

    在Java中,利用过双缓冲技术,先将画笔画在内存上,再转化为图片,调出来. 当画的东西过多造成处理不过来时,双缓冲技术将防止闪屏. 在Paint方法下,我们这样写: BufferedImage tmp ...

  10. 嵌套ajax 页面卡死的问题

    问题:要一个AJAX中的回调函数中又进行了一个AJAX调用,并且这个AJAX是在一个循环调用的,不论设置async属性是true和false页面卡死. 解决方法:async属性都设为true,不用循环 ...