VC下动态库dll,静态库lib的编写和使用方法

摘要:
在一些项目中,考虑到系统的安全性和稳定性,经常要封装一些DLL或者LIB库供别人使用,那么怎么制作DLL或者LIB文件呢?今天特酷吧根据自己的实际情况给大家讲解下基本的制作方法。以下是我亲自操作的记录:1,动态库dll的编写方法:新建一个动态链接库:填好工程名称即可选择工程类型,如果没有特别的要求,选择一个空工程即可。会看到这里和标准的控制台工程一样,没有任何系统默认建立的文件下面就需要我们添加一些文件。建立动态库dll文件 , 我们不需要写main函数。只需要一个一个的实现我们需要实现的接口函

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


免责声明:文章转载自《VC下动态库dll,静态库lib的编写和使用方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转)Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群如何通俗理解泊松分布下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

应用开发框架之——数据字典、原数据、模板

对象根据原数据动态生成,改变原数据,根据原数据动态生成的对象的属性也随之改变。 可以把原数据保存在数据表中,或者文件中。软件系统运行的时候读取这些原数据,然后动态地生成一些对象。 在管理软件里面,我们习惯性地叫数据字典。为此会专门设计一个数据字典的数据表来保存原数据。通过软件设置改变就是数据字典数据表里面的原数据。 模板,大概是c++的叫法。无论怎样,数据...

ffmpeg 踩坑实录 添加实时水印(二)

一、背景介绍       最近领导要求做一个视频录制的相关项目。其中,需要对视频文件进行添加 实时时间水印。于是,我想到了使用之前的ffmpeg来做。 二、ffmpeg实际操作        首先把需要添加水印的视频文件,上传到服务器指定位置 比如 “/usr/local/1.mp4”,这样的地方。其次,我们需要了解如何去给视频添加水印。 这里提供两种方式...

[翻译]AxureDynamic Panel(Basic)原型设计工具Axure学习第2.1节

Hide and show with Dynamic Panel(Basic) Dynamic Panel允许你隐藏,显示,交换和移动wireframe的内容。本章节讲述dynamic panels的隐藏,显示内容的初级功能。更高级的用法请点击 Dynamic Panels(Advanced)教程视频:下载MP4格式 Dynamic Panels...

WPF: 把引用的dll移动到自定义路径

需求: 有A.exe和B.exe, 都引用了 C.dll, output路径都是 W:Debug. A和B都添加了对C的引用,正常情况下C会被复制到 output 里面。 C这样子的dll很多,不想把它们和exe放在同一级的目录,移动到子目录,如W:Debug3rdDll 办法: 1. 首先设置C.dll  打开Project A的References,...

解决studio 3T时间到期的两种方法

解决studio 3T时间到期的两种方法 此教程并非真正破解,而是通过重置studio 3t的试用时间解决的。 第一种方法 按住运win 和 r 键输入 regedit 找到以下路径HKEY_USERSS-1-5-21-xxxxxxxxxxxxxxSOFTWAREJavaSoftPrefs3tmongochefenterprise 将除了 inst...

linux挂载samba文件系统的方法

1 手工挂载 有两个命令可以用来手工挂载samba文件系统,一个是mount,一个是smbmount。1.1 使用mount命令挂载  mount就是用于挂载文件系统的,SMB做为网络文件系统的一种,也能用mount挂载   一般挂载的用法为:mount -t smbfs -o codepage=cp936,username=用...