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文件。
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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM