VS2005创建DLL
使用VS2005创建自己的动态链接库,这样就不用看到DLL文件有抵触情感了。
一、打开VS2005软件,创建DLL工程。起名ceshi1.
1)
2) 点击下一步,应用程序类型为DLL,空工程。
3) 完成,一个新的DLL工程设置完毕,接下来编辑源码
添加头文件,命名为ceshi1.h,编辑内容:
#ifndef CESHI1_H
#define CESHI1_H //防止重复定义
#include <iostream> //头文件引用
#if defined DLL_EXPORT //源文件需引用下一函数
#define DECLDIR __declspec(dllexport)//就是这个
#else
#define DECLDIR __declspec(dllimport)
#endif
extern "C"
{
DECLDIR int add(int a, int b); //函数声明
DECLDIR void function(void);
}
#endif
解释:VC中有两种方式导出DLL文件中的函数
1) 使用 __declspec关键字。
2) 创建模板定义文件(Module_Definithion File)即.def文件。
在此使用第一种方法:
__declspec(dllexport)作用是导出函数符号到DLL的一个存储类中。在头文件中定义#define DECLDIR __declspec(dllexport)宏来运行这个函数。
使用条件编译,在源文件中宏定义 #define DLL_EXPORT 来运行这个函数。
//******************************************************************************
创建源文件 ceshi1.cpp
#include <iostream>
#define DLL_EXPORT
#include "ceshi1.h"
extern "C"
{
//定义Dll中的所有函数
DECLDIR int add(int a, int b)
{
return a+b;
}
DECLDIR void function(void)
{
std::cout<<"DLL called"<<std::endl;
}
}
编译工程,生成ceshi1.dll文件和ceshi1.lib文件(注:找到工程目录,这两个文件在外面的debug文件夹下)。
二、使用创建好的DLL库文件
创建一个控制台应用程序
1) 隐式链接:
连接到.lib文件,首先将ceshi1.h头文件,ceshi1.dll动态库文件,ceshi1.lib静态库文件放在控制台应用程序工程的目录中,即源文件所在的文件夹里。
添加源文件ceshi2.cpp,编码:
#pragma comment(lib,"ceshi1.lib")//链接.lib文件
#include "ceshi1.h" //包含dll的头文件
#include <iostream>
int main()
{
function();
std::cout<<add(25,25)<<std::endl;
getchar();
return 0;
}
//******************************************************************************
2) 显式链接
只加载.dll文件,但需用到函数指针和Windows 函数,不需要.lib文件和.h头文件。
#include <iostream>
#include <windows.h>
typedef int (*AddFunc)(int, int);
typedef void (*FunctionFunc)(void);//函数指针
int main()
{
AddFunc _AddFunc;
FunctionFunc _FunctionFunc;
//HINSTANCE实例句柄(即一个历程的入口地址)
HINSTANCE hInstLibrary = LoadLibraryA("ceshi1.dll");
//注意,此时的LoadLibraryA()窄字符集和LoadLibraryW()宽字符集的区别,后有介绍。
if(hInstLibrary == NULL)
{
FreeLibrary(hInstLibrary);//释放DLL获得的内存,若句柄无效
}
//获得函数的入口地址,还需类型转换
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary,"add");
_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary,"function");
if(_AddFunc==NULL || _FunctionFunc ==NULL)//确定是否成功。
{
FreeLibrary(hInstLibrary);
}
std::cout<<_AddFunc(25,25)<<std::endl;
_FunctionFunc();
getchar();
FreeLibrary(hInstLibrary);
return 0;
}
//******************************************************************************
Windows 的执行文件可以划分为两种形式:程序和动态连接库(DLLs)。一般程序运行是用.EXE文件,但应用程序有时需要调用存储在DLL 中的函数。
当我们调用Windows 中的API 函数的时候,实际上就是调用存储在DLL 中的函数。
在如下几种情况下,调用DLL 是合理的:
1) 不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销。
2) 当某些内容需要升级的时候,如果使用DLL 只需要改变DLL 就可以了,而不需要把整个程序都进行变动。
3) 由于DLL 是独立于语言的,所以,当不同语言习惯的人共同开发一个大型项目的时候,使用DLL 便于程序系统的交流,当然,Delphi开发的DLL 也可以在诸如Visual BASIC,C++ 等系统中使用。
2 C语言创建DLL
只是要在公开的接口函数声明前面加上几个特定的修饰符。
//**********example1.h***********************************************************
#ifndef EXAMPLE1_H
#define EXAMPLE1_H
#define DLLIMPORT __declspec(dllexport)
DLLIMPORT void HelloWorld(void);
#endif
//******example1.c***************************************************************
#include "example1.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld(void)
{
MessageBox(0,TEXT("Hello World from DLL!\n"),TEXT("Hi"),MB_ICONINFORMATION);
}
BOOL APIENTRY DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
switch(reason){
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_TH