在一些項目中,考慮到系統的安全性和穩定性,經常要封裝一些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/