在一些項目中,考慮到系統的安全性和穩定性,經常要封裝一些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檔案。
extern HANDLE OpenDog();
function.cpp
HANDLE OpenDog()
如此,編譯即可。
但是我在這裡遇到了很多問題 , 編譯的時候總是提示錯誤。這主要是一些命名空間的重名造成的。這種錯誤很麻煩。這裡給出我在編譯lib時的工程設定。
具體的要特别注意到第二張顯示的忽略庫
lib靜态庫的使用:使用#pragma comment(lib, "AppTest.lib")後 , 直接調用靜态庫的函數即可。
#pragma comment(lib, "AppTest.lib")
HANDLE EncrypDog;
EncrypDog = OpenDog();
if( EncrypDog == INVALID_HANDLE_VALUE )