DLL基本应用
来源:互联网 发布:测试耳朵听力软件 编辑:程序博客网 时间:2024/06/03 05:37
DLL基本应用
编写DLL模块
调用DLL模块
编写DLL模块
DLL有三种类型:Non-MFC DLL、Regular DLL、Extension DLL。本文主要以Non-MFC DLL为主。
在VS2010中创建一个DLL工程,选择Win32控制台选项中的DLL选项。为了方便,我们选择非空项目,这样VS2010会为我们创建好基本框架,包含DLL模块的入口点DllMain函数。
一般Dll模块中,有三种类型可以导出:全局变量、函数、类。导出方法也有两种,一种是通过使用__declspec(dllexport),添加到需要导出的函数前,进行声明;另外一种就是通过模块定义文件(Module-Definition File即.DEF)来进行声明,这里我们只介绍第一种。
//MyDll.h#pragma once#ifdef _MYDLL_H_#define MYDLLAPI __declspec(dllexport)#else#define MYDLLAPI __declspec(dllimport)#endif//导出类class MYDLLAPI MyDll{public: MyDll(); virtual ~MyDll(); virtual int func();};//如果想用显示的方法调用类对象,可以采用如下方式extern "C" MYDLLAPI MyDll* CreateObject(){ return new MyDll;}//导出函数extern "C" MYDLLAPI void Dllfunc(int);//全局变量MYDLLAPI extern int Dlldata;#undef _MYDLL_H_//MyDll.cpp#define _MYDLL_H_ #include "MyDll.h"MyDll::MyDll(){}MyDll::~MyDll(){}int MyDll::func(){ return 0;}void Dllfunc(int a){ Dlldata = a;}
说明:
__declspec(dllexport)
表示导出,就是从DLL模块中导出到使用DLL的应用程序中去;
__declspec(dllimport)
表示导入,就是使用DLL的应用程序在调用DLL时,需要导入DLL模块中的内容。在DLL实现文件中采用#define _MYDLL_H_
方式区分导出和导入。extern “C”表示以C的方式编译函数,由于在C++中函数编译方式和C中不一致,为了调用正确,可以统一采用C的方式编译函数。
正确编译后,会产生两个文件:MyDll.lib和MyDll.dll。
调用DLL模块
应用程序调用DLL模块,有两种方式:隐式调用和显示调用。
- 隐式调用
需要DLL模块的三个文件:MyDll.h、 MyDll.lib、 MyDll.dll。建议MyDll.h和Mydll.lib这两个文件放到工程目录下,MyDll.dll放到执行程序目录下。
//Test.cpp#include "MyDll.h"#include <iostream>using namespace std;#pragma comment(lib, "MyDll.dll")int Dlldata; //Dll 全局变量导出声明int main(){ //Dll导出类 MyDll mydll; cout<<mydll.func()<<endl; //Dll导出变量 Dlldata = 1; cout<<Dlldata<<endl; //Dll导出函数 Dllfunc(2); cout<<Dlldata<<endl; return 0;}
- 显示调用
只需要DLL模块的一个文件:MyDll.dll。但是如果是显示调用一个类,还需要MyDll.h(包含MyDll类的定义)。MyDll.dll放到执行程序目录下。
//Test.cpp#include "MyDll.h" //for MyDll调用#include <iostream>using namespace std;//声明函数指针,对应Dll模块中的函数typedef void (*DLLFUNC)(int);typedef MyDll* (*CREATEOBJECT)();int main(){ //Dll导出类 CREATEOBJECT cobj; cobj= (CREATEOBJECT) HINSTANCE hinstance = LoadLibrary("MyDll.dll"); if (NULL == hinstance) { FreeLibrary(hinstance); cerr<<"LoadLibrary fail"; return -1; } cobj = (CREATEOBJECT)GetProcAddress(hinstance, "CreateObject"); if(NULL == cobj) { FreeLibrary(hinstance); cerr<<"Load Address fail"; return -1; } MyDll* pmydll = (*CREATEOBJECT)(); if (pmydll == NULL) { FreeLibrary(hinstance); cerr<<"MyDll Class create fail"; return -1; } //Dll导出函数,与上面相同 //Dll导出变量 int dlldata; dlldata = *(int *)GetProcAddress(hinstance, "Dlldata"); FreeLibrary(hinstance); return 0;}
关于DLL更加详细的说明,请参考下面的博客
- DLL基本应用
- AjaxPro.2.dll 基本应用(转)
- DLL的应用。
- dll编制与应用
- 资源Dll的应用
- DLL的生成应用
- DLL应用小结
- 各种 DLL 控件应用
- Shlwapi.dll 应用系列
- Shlwapi.dll 应用系列
- Shlwapi.dll 应用系列
- Shlwapi.dll 应用系列
- Shlwapi.dll 应用系列
- Wininet.dll 应用系列
- DLL的简单应用
- Iphlpapi.dll的应用
- VC++的DLL应用
- DLL应用基础知识
- 学习jQuey中的return false
- 排序算法(一)直接插入排序
- Android动画之Interpolator(插值器)
- js中将json解析为对象的两种方法及其优劣
- 归并排序
- DLL基本应用
- java之Servlet
- 梯度消失和梯度爆炸
- hdu4718 The LCIS on the Tree(树链剖分)
- PAT 乙级练习题1016. 部分A+B (15)
- 继承AbstractCommandController的Action
- How to teach my daughter programming(1)
- 【解决】mysql 全连接问题
- java反射机制