天天看點

VC下動态庫dll,靜态庫lib的編寫和使用方法

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

繼續閱讀