DLL生成与使用的全过程

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

时间: 2024-10-23 19:17:51

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

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

本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边边框.有需要的朋友们可以试一下,如有bug欢迎指正. 首先,将 ThoughtWorks.QRCode.dll 放在 bin 目录后,在页面中引用: using ThoughtWorks.QRCode.Codec; 生成二维码图片: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

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

本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW",和MinGW的说明HOWTO Create an ImportLibrary for a DLL using MinGW,学习怎样生成lib库.当中OpenBlas的说明讲的是怎样使用Visual studio的lib.exe工具从dll生成lib文件,而MinGW讲的是怎样把一个windows

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

原文:http://blog.csdn.net/kongwei521/article/details/17588825 首先效果: 1:首先下载BarcodeLib.dll 下载地址 http://pan.baidu.com/share/link?shareid=2590968386&uk=2148890391&fid=1692834292 如果不存在了则自行搜索下载. 1.BarcodeLib.dll 一维条码库支持以下条码格式 UPC-A UPC-E UPC 2 Digit Ext.

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

本文针对Windows平台下,python调取C/C++的dll文件. 1.如果使用C语言,代码如下,文件名为test.c. __declspec(dllexport) int sum(int a,int b) { return (a + b); } 如果使用C++语言,代码如下,文件名为test_cpp.cpp. #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT int sum(int a,int b) { re

一个简单的DLL生成和测试

DLL文件内容: SKLDll.h #ifndef _SKLDLL_H_#define _SKLDLL_H_ #ifndef DLL_API #define DLL_API extern "C" __declspec(dllexport) #else #define DLL_API extern "C" __declspec(dllimport) #endif DLL_API int add(int a,int b); #endif//_DLLMAIN_DLL_H_

C#使用ThoughtWorks.QRCode.dll生成二维码以及解码

最近一段时间在网上找了二维码的生成代码,但是生成的二维码右上角的背景色总是透明的,所以自己拿过来改了一下,给自己做个总结. 代码如下: using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using ThoughtWorks.QRCode.Codec;using ThoughtWorks

C++ 生成 dll 和调用 dll 的方法实例(转)

1)生成dll 建立两个文件 xxx.h , xxx.cpp xxx.h内容如下: #ifdef BUILD_XXX_DLL#define EXPORT __declspec(dllexport)#else#define EXPORT __declspec(dllimport)#endif extern "C"{EXPORT void example(void);... ...} xxx.cpp内容如下: #define BUILD_XXX_DLL#include "xxx.

生成dll文件的示例

看了好多网上写的关于dll文件生成和实用的资料发现多尔不全,都是抄来抄去,有的干脆就是搬用msdn上的原文,实在没有创意和可看的东西.于是本着学和实用的目的自己实践的东西分享给大家. 大前提:使用VS2010作为dll生成工具 概述:主要通过构建一个解决方案中的一个项目来演示如何定义和生成dll文件,在同一个方案中在创建一个项目主要用来进行生成dll的使用. 简易结构图: testdll(解决方案名) |--makedll(生成dll项目名) |--testdll(使用dll项目名) maked

[转]windows下VS2010中lib与dll文件的生成与使用

原文地址:https://my.oschina.net/SysuHuyh5LoveHqq/blog/644622 近期在windows下开发了某个程序,需要将其生成静态文件(lib)以及动态库文件(dll),其中参考了不少帖子,有的讲得也不是很清楚明白,先将本人实践过的记录一下,供后期自己查询,也供各位大牛点评. 一.lib文件的生成与使用 1.lib的生成 相对来说,静态库文件还是比较容易生成和使用的,在代码上,貌似也不需要更改什么,举例说明: 头文件函数声明形式如下: extern bool