在一些项目中,考虑到系统的安全性和稳定性,经常要封装一些DLL或者LIB库供别人使用,那么怎么制作DLL或者LIB文件呢?今天特酷吧根据自己的实际情况给大家讲解下基本的制作方法。
以下是我亲自操作的记录:
1,动态库dll的编写方法:
新建一个动态链接库:
填好工程名称即可选择工程类型,如果没有特别的要求,选择一个空工程即可。
会看到这里和标准的控制台工程一样,没有任何系统默认建立的文件
下面就需要我们添加一些文件。
建立动态库dll文件 , 我们不需要写main函数。只需要一个一个的实现我们需要实现的接口函数即可.这里需要用到
extern "C" __declspec(dllexport) 说明 。 在函数的声明中加上extern "C" __declspec(dllexport)就可以将该函数导出。
例如 :
新建function.h , function.cpp
function.h
#ifndef __FUNCTION_H__
#define __FUNCTION_H__
#include<afx.h>
#include"include.h"
//3DES加密函数.24字节的key(导出函数)
extern "C" __declspec(dllexport)HANDLE Open();
#endif
而在function.cpp中可以写
extern "C" __declspec(dllexport) HANDLE Open()
{
HANDLE DevHandle = INVALID_HANDLE_VALUE;
DevHandle = OpenDevice();
return DevHandle;
}
完成之后编译 , 就可以在debuf或者release文件夹中看到dll文件了。
使用dll文件也很简单:将生成的dll文件放在应用程序的工程目录,我们还需要上一步的导出头文件。
#include"AppTest.h"
//#pragma comment(lib, "AppTest.lib ")
HINSTANCE MyDll;
HANDLE Encryp;
//打开dll文件
MyDll = LoadLibrary("AppTest.dll");
if(MyDll == NULL)
{
exit(0);
}
typedef HANDLE(*DllFun)();//函数指针,注意要和原函数的原型一制
DllFun MyFun;
MyFun = (DllFun)GetProcAddress(MyDll , "Open");//获取该函数的虚拟地址
if(MyFun == NULL)
{
AfxMessageBox("获取dll函数失败!");
exit(0);
}
Encryp = MyFun();//调用MyFUn实际上是调用了dll中的OpenDog
if( Encryp == INVALID_HANDLE_VALUE )
{
exit(0);
}
静态库的创建与应用
新建一个静态库工程
没有什么注意的选项 ,默认即可。完成之后 , 工程目前也是什么文件都没有 , 需要我们自己添加。我们也不写main函数,只需要写功能函数的实现。然后在头文件中用extern修饰 , 编译即可。
如我们新建function.h , function.cpp文件。
function.h
#ifndef __FUNCTION_H__
#define __FUNCTION_H__
#include<afx.h>
#include"include.h"
extern HANDLE OpenDog();
#endif
function.cpp
HANDLE OpenDog()
{
HANDLE DevHandle = INVALID_HANDLE_VALUE;
DevHandle = OpenDevice();
return DevHandle;
}
如此,编译即可。
但是我在这里遇到了很多问题 , 编译的时候总是提示错误。这主要是一些命名空间的重名造成的。这种错误很麻烦。这里给出我在编译lib时的工程设置。
具体的要特别注意到第二张显示的忽略库
lib静态库的使用:使用#pragma comment(lib, "AppTest.lib")后 , 直接调用静态库的函数即可。
#include"AppTest.h"
#pragma comment(lib, "AppTest.lib")
HANDLE EncrypDog;
EncrypDog = OpenDog();
if( EncrypDog == INVALID_HANDLE_VALUE )
{
exit(0);
}
本文来源于特酷吧http://www.tekuba.net/, 原文地址:http://www.tekuba.net/program/179/