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

简介: 在一些项目中,考虑到系统的安全性和稳定性,经常要封装一些DLL或者LIB库供别人使用,那么怎么制作DLL或者LIB文件呢?今天特酷吧根据自己的实际情况给大家讲解下基本的制作方法。以下是我亲自操作的记录:1,动态库dll的编写方法:新建一个动态链接库: 填好工程名称即可选择工程类型,如果没有特别的要求,选择一个空工程即可。

 


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

 

目录
相关文章
|
10月前
Qt对动态库(*.dll)的封装以及使用
Qt对动态库(*.dll)的封装以及使用
199 0
|
10月前
|
编译器 C++ Windows
静态库(lib),动态库(dll)
静态库(lib),动态库(dll)
|
编译器 C语言 C++
【转】Lib静态链接库和Dll动态链接库
【转】Lib静态链接库和Dll动态链接库
126 0
CMake教程5:可执行程序调用lib
CMake教程5:可执行程序调用lib
298 0
|
编译器 C++ 开发者
头文件.h、动态链接库.dll、静态链接库.lib的区别与应用总结
头文件.h、动态链接库.dll、静态链接库.lib的区别与应用总结
811 0
头文件.h、动态链接库.dll、静态链接库.lib的区别与应用总结
|
C++ Windows API
C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法     1  LIB文件直接加入到工程文件列表中   在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件。
4496 0
|
Java Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(二)
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(二)
153 0
|
Java Android开发 C++
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
175 0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni 中 main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )(一)
|
Unix 程序员 编译器
Qt之创建并使用静态链接库
简述 摘自维基百科: 静态链接库(Statically-linked library),或称静态库,是一个外部函数与变量的集合体。
1381 0