DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 


在一些项目中,考虑到系统的安全性和稳定性,经常要封装一些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/

 

posted on 2012-11-22 20:20  DoubleLi  阅读(5452)  评论(0编辑  收藏  举报