dll学习

来源:互联网 发布:c语言两个竖线 编辑:程序博客网 时间:2024/06/03 20:53
如何使用别人的dll

1、把.lib(连接时用,最终发布时不需要)和.dll放到工程目录下
2、在程序中(比如stdafx.h中)#pragma comment(lib,"xxx.lib")或者工程->设置里添加对象/库模块
3、包含头文件,#include "xxx.h"
完成后,就可以像使用你自己的类或方法一样使用dll了。
-------------------------------------------------分割线------------------------------------------------------
lib和dll文件的区别和联系

.dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib文件,就必须:
1 包含一个对应的头文件告知编译器lib文件里面的具体内容
2 设置lib文件允许编译器去查找已经编译好的二进制代码

如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress。事实上,我们可以在Visual C++ IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。一般我们最主要的关于lib文件的麻烦就是出现unresolved symble 这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含:
extern "C"
{
#include "myheader.h"
}
这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错。
---------------------------------------------------------------分割线---------------------------------------------------------------------
写自己的dll

方法一:使用export和import
1、首先创建一个dll的头文件。dll的源码文件(.cpp)需要包含这个头文件,而且使用这个动态连接库的可执行文件也需要这个头文件。这个头文件包含你想要从dll输出的函数的原型、结构和符号。下面是一个名为a.h文件的的例子。

//a.h
#ifndef A_H_
#define A_H_
#define MYFIRSTDLL extern "C" __declspec(dllimport)
MYFIRSTDLL 
void ShowText();
#endif

2、然后创建a.cpp.代码如下。

//a.cpp
#define MYFIRSTDLL extern "C" __declspec(dllexport)
#include 
<stdio.h>
#include 
"a.h"
void ShowText()
{
printf(
"This is dll export show. ") ;
}

在Project->setting->link 最下面加上“/dll”,"/"之前有空格,然后编译,就可以在debug或release下面找到dll 和lib文件了。在使用a.dll这个动态连接库的时候,应该把a.h头文件包含在可执行文件中,而且还要把a.lib连入程序。

下面的代码是使用这个动态连接库的测试程序。

//testdll.cpp
#include <stdio.h>
#include 
<iostream.h>
#include 
"a.h"
#pragma comment(lib,"a.lib")
int main()
{
 ShowText() ; 
//这个函数是从动态连接库a.dll中调用的
 printf("This is execute show  ") ;
 
return 1;
}

方法二:使用def文件
如上建立2个文件a.h和a.cpp

//a.h
void ShowText();
//a.cpp
#include <stdio.h>
#include 
"a.h"
void ShowText()
{
printf(
"This is dll export show   ") ;
}

然后再当前目录下面建立一个.def文件,文件名最好和要输出的dll名字一样,扩展名为.def, 里面写上:

LIBRARY a.dll 
EXPORTS
ShowText @
1

然后将这个文件添加到工程中,在link中设置 /dll, 然后编译,在debug或release中就可以找到dll和lib了,使用的时候加上dll.h文件。
例二

//b.h
int Add (int iLeft, int iRight) ; 
int Sub (int iLeft, int iRight) ; 
//b.cpp 
#include "b.h" 
int Add(int iLeft, int iRight) 

return iLeft + iRight ; 
}
 
int Sub (int iLeft, int iRight) 

return iLeft - iRight ; 
}
 
//b.def
LIBRARY b.dll 
EXPORTS
Add @
1
Sub @
2

//testb.cpp
#include <stdio.h>
#include 
<iostream.h>
#include 
"b.h"
#pragma comment(lib,"b.lib")
int main()
{
 
int a = Add(1,3);
 
int b = Sub(5,3);
 cout
<<a;
 cout
<<b;
 
return 1;
}
 
原创粉丝点击