由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. LNMP1.4 PHP升级脚本

    升级PHP前,请确认你的网站程序是否支持升级到的PHP版本,防止升级到网站程序不兼容的PHP版本,具体可以去你使用的PHP程序的官网查询相关版本支持信息.v1.3及以后版本大部分情况下也可以进行降级操 ...

  2. Idea下载后初始配置(windows环境下)

    专业版的intellij可以免费试用30天.为了以后开发方便,咱们需要下载专业版进行破解. 一.破解 安装过程中有个界面如下,咱们选择License server填上http://idea.itebl ...

  3. 在WP应用中创建全局应用程序栏

    创建一个WindowsPhone应用程序(这个就不用说了吧,嘿嘿) 打开项目中的App.xaml文件 在打开的App.xaml文件中,如图所示, 在<Application.Resources& ...

  4. MySQL下载安装、基本配置、问题处理

    一 mysql介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...

  5. javascript实现jsp页面的打印预览

    1.加载WebBrowser打印预览控件 <OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" heigh ...

  6. poj 1882完全背包变形

    题意:给出一个上限硬币数量s,给出n套硬币价值,求一套硬币能用不大于s数量的硬币组成从1开始连续的区间价值,其中,如果其最大值相同,输出数量小的和价值小的. 思路:很明显的完全背包,纠结后面最大值相同 ...

  7. [转载]PS各个工具的字母快捷键和英文全名

    原文地址:PS各个工具的字母快捷键和英文全名作者:Tycho     选框-Marquee(M)     移动-move(V)     套索-Lasso(L)     魔棒-Wand(W) 喷枪-in ...

  8. JUnit之TestCase和TestSuite详解

    首先介绍下TestCase以及TestSuite.    TestCase:字面意思,测试用例.为一个或多个方法提供测试方法.一般是一个test    TestSuite:测试集合,即一组测试.一个t ...

  9. 提高SQL执行效率的16种方法

      项目中优化sql语句执行效率的方法:1)尽量选择较小的列2)将where中用的比较频繁的字段建立索引3)select子句中避免使用'*'4)避免在索引列上使用计算.not in 和<> ...

  10. CSS基础知识摘要

    元素分类 块级元素 什么是块级元素?在html中<div>. <p>.<h1>.<form>.<table>.<ul> 和 &l ...