1. 程式人生 > >如何建立動態連結庫(DLL)

如何建立動態連結庫(DLL)

動態連結庫

n動態連結庫通常不能直接執行,也不能接受訊息。他們是一些獨立的檔案,其中包含能被可執行程式或其他DLL呼叫來完成某項工作的函式。只有在其他模組呼叫動態連結庫中的函式時,它才發揮作用。

nWindows API中的所用函式都是包含在DLL中。其中有3個最重要的DLL Kernel32.dll,它包含用於管理記憶體、程序和執行緒的各個函式;User32.dll,它包含用於執行使用者介面任務(如窗體的建立和訊息的傳遞)的各個函式。

n靜態庫:函式和資料被編譯進一個二進位制檔案(通常副檔名為.LIB)。在使用靜態庫的情況下,編譯連結可執行檔案時,連結器從庫中複製這些函式和資料並把他們和應用程式的其他模組組合起來建立最終的可執行檔案(

.EXE檔案)。

n動態庫:在使用動態庫的時候,往往提供兩個檔案:一個引入庫和一個DLL。引入庫包含被DLL匯出的函式和變數的符號名,DLL包含實際的函式和資料。在編譯連結可執行檔案時,只需要連結引入庫,DLL中的函式程式碼和資料並不複製到可執行檔案中,在執行的時候,再去載入DLL,訪問DLL中的匯出函式。

n使用動態連結庫的好處:

1.可以採用多種程式語言來編寫。

2.增強產品的功能。

3.提供二次開發的平臺。

4.簡化專案管理。

5.可以節省磁碟空間和記憶體。

6.有助於資源的共享。

7.有助於實現應用程式的本地化

n引入方式:

1.隱式引入(直接在專案設定裡連結選項卡里匯入.LIB的引入檔案)

2.顯示引入(使用LoadLibraryGetProcAddressFreeLibrary

n匯出宣告

使用模版定義檔案(.def

作用:禁用名字改編但類不能禁用,類的方法卻可以禁用,但呼叫約定也要保持一致。

LIBRARY “Dll1”

EXPORTS

add

subtract

n在客服端的使用

在原始檔中宣告的方式:

1.Extern int add(int a, int b);

Extern int subtract(int a, int b);

推薦(更快)

2._declspec(import) int add(int a, int b);

_declspec(import) int subtract(int a, int b);

在標頭檔案中的宣告的方式:

Dll1.h

#ifndefDLL1_API

#defineDLL1_APIextern “C”_declspec(dllimport)

#endif

DLL1_APIint add(int a,int b);

DLL1_APIint subtract(int a,int b);

Dll.cpp

#defineDLL1_APIextern “C”_declspec(dllexport)

#include"DLL1.h"//包含定義的標頭檔案-Dll1.h

注:extern “C”使函式不參加名字改編但是不能匯出類只能全域性函式。如果函式的呼叫約定發生改變也將參加名字改編比如將預設的c語言呼叫約定改為了pascal呼叫約定時。

n例項

為了演示建立動態連結庫的一個過程,在此例項中只完成在動態連結庫中建立一個類和兩個函式。

Step1.新建一個空的動態連結庫工程。

Step2.新增一個頭檔案(Dll3.h)錄入如下程式碼:

#ifndefDLL3_API

#defineDLL3_API_declspec(dllimport)

#endif

DLL3_APIint add(int,int);

DLL3_APIint subtract(int,int);

class DLL3_API MyRectangle

{

public:

MyRectangle(int,int);

int GetArea();

private:

int width_;

int height_;

};

Step3.新增一個原檔案(Dll3.cpp)錄入如下程式碼:

#defineDLL3_API_declspec(dllexport)

#include"Dll3.h"

int add(int a,int b)

{

return a + b;

}

int subtract(int a,int b)

{

return a - b;

}

MyRectangle::MyRectangle(int w, int h):width_(w), height_(h){}

int MyRectangle::GetArea()

{

return width_ * height_;

}

Step4.新增一個模版定義檔案(Dll3.def)錄入如下程式碼:

在當前目錄下建立一個文字檔案更名為Dll3.def再匯入到工程中即可

LIBRARY "Dll3"

EXPORTS

add

subtract

GetArea

Step5.編譯工程。

Step6.建立一個測試動態連結庫的對話方塊工程(DllTest

Step7.在對話方塊中新增三個按鈕測試動態連結庫的函式(庫以隱式引入)

Step8.把動態連結庫工程Debug目錄下的Dll3.dllDll3.lib以及Dll3.h檔案要不然編譯器會找不到你需要的函式和函式的宣告。

Step9.匯入Dll3.h標頭檔案

#include ”Dll3.h”

Step10.新增按鈕的單擊處理事件(雙擊當前按鈕即可)

void CTestDllDlg::OnBtnAdd()

{

CString result;

result.Format("3 + 5 = %d", add(3, 5));

MessageBox(result);

//下面是庫以顯示方式呼叫,如果使用顯示方式就不需要隱式的匯入庫也不需要Dll3.h標頭檔案,因為顯示方式是在程式執行後單擊按鈕才載入的並獲取了函式的地址,所以可以直接呼叫。

/*HINSTANCE hinst;

hinst = LoadLibrary("Dll3.dll");

typedef int (*FARProc)(int a, int b);

FARProc proc;

proc = (FARProc)GetProcAddress(hinst, "add");

if(!proc)

{

MessageBox("沒有找到函式地址");

return;

}

CString result;

result.Format("3 + 5 = %d", (*proc)(3, 5));

MessageBox(result);

FreeLibrary(hinst);

*/

}

void CTestDllDlg::OnBtnSubtract()

{

CString result;

result.Format("5 - 3 = %d", subtract(5, 3));

MessageBox(result);

}

void CTestDllDlg::OnBtnClass()

{

MyRectangle rect(10, 5);

CString result;

result.Format("W:10 H:5 A=%d", rect.GetArea());

MessageBox(result);

}

Step10.測試

 

宣告:此文件是由孫鑫老師教學視訊整理,需要更詳細的學習動態連結庫的相關知識可以在百度上搜索“孫鑫VC++視訊”共20集非常不錯的VC++教學視訊。

相關推薦

如何建立動態連結(DLL)

動態連結庫 n動態連結庫通常不能直接執行,也不能接受訊息。他們是一些獨立的檔案,其中包含能被可執行程式或其他DLL呼叫來完成某項工作的函式。只有在其他模組呼叫動態連結庫中的函式時,它才發揮作用

codeblocks中建立和呼叫動態連結(dll)

一、建立C語言動態連結庫 1.建立。 File->New->Projects->Dynamic Link library->Go 給專案命名為:Dynamic librar

vs2010 建立和C#使用動態連結(dll)

一、VS 用 C++ 建立動態連結庫 Step 1:建立Win32 Console Application 本例中我們建立一個叫做“Test”的Solution。 Step 2:將Ap

vs2010 C++建立和使用動態連結(dll)

一、用C++建立動態連結庫專案:  1、開啟Microsoft Visual Studio 2010,選擇File->New->Project。  2、在NewProject中選擇Inst

Tensorflow安裝在windows 上面出現ImportError: DLL load failed: 動態連結(DLL)初始化例程失敗。

      最近開始學習tensorflow,電腦是win10 64位系統的,已經安裝了python3.6.1 32位的,tensorflow只支援python64位的,所以直接安裝了Python64位3.6.1。直接使用pip install tenso

c#(winform)環境下使用動態連結dll的詳解

  1,什麼是dll檔案? DLL(Dynamic Link Library)檔案為動態連結庫檔案,又稱“應用程式拓展”,是軟體檔案型別。在Windows中,許多應用程式並不是一個完整的可執行檔案,它們被分割成一些相對獨立的動態連結庫,

使用LabVIEW通過動態連結DLL遠端操作Oracle資料庫

很多情況下,遠端操作資料庫時,需要在不裝Oracle客戶端的情況下進行,儘可能降低客戶端安裝各類軟體的時間。 首先我們從網上下載Oracle資料庫操作dll檔案。 動態連結庫通過ildasm.exe反彙編檢視,這個檔案是.net 4.0版本的封裝檔案。 在LabVI

MFC/Qt下呼叫caffe原始碼(一)---將caffe原始碼生成動態連結dll

本人研一,最近想將用caffe訓出的模型,通過MFC做出一個介面,扔進一張圖片,點選預測,即可呼叫預測分類函式完成測試,並且通過MessageBox彈出最終分類的資訊。 首先通過查資料總結出兩種方法,第一:直接呼叫編譯好的caffe原始碼;(本次用到的原始碼是classif

Java通過JNI 呼叫動態連結DLL

JNI(Java Native Interface)Java本地介面,主要作用是實現java程式碼與C、C++編寫的程式碼互動。 在Android程式設計中,so庫的訪問也用到了jni技術。 理論多說無益,還是看java連線dll的實戰吧。如下: 例:java中呼叫demo.

Windows動態連結DLL的使用

windows程式設計使用動態連結庫可以有效的分隔大型專案的模組,DLL裡面主要提供函式的呼叫介面(函式名)供其他的外部引用程式呼叫,呼叫者在完全不知道動態連結庫中的實現方式的情況下,仍然能根據其提供的函式名,函式型別, 和函式的引數實現呼叫。windows程式中建立DLL

動態連結 —— Dll 基礎

1. DLL 的初識   在 windows 中,動態連結庫是不可缺少的一部分,windows 應用程式程式介面提供的所有函式都包含在 DLL 中,其中有三個非常重要的系統 DLL 檔案,分別為 Kernel32.dll、User32.dll 和 GDI32.dll,下面說下這三個重要的 DLL 的用途:

動態連結dll的 靜態載入 與 動態載入

dll 兩種連結方式  : 動態連結和靜態連結(連結亦稱載入) 動態連結是指在生成可執行檔案時不將所有程式用到的函式連結到一個檔案,因為有許多函式在作業系統帶的dll檔案中,當程式執行時直接從作業系統中找。   而 靜態連結就是把所有用到的函式全部連結到exe檔案中。 動態連結是隻建立一個引用的介

C#呼叫C/C++動態連結(.dll)詳解

第一篇編譯C的動態連線庫 在實際工作中,我們經常會將C語言中的.lib和.h檔案(靜態庫)編譯成動態連線庫.dll檔案(這裡只提供這兩種檔案,沒有完整的工程),以提供給其他語言平臺呼叫。 1,必須有.lib檔案,只有.h檔案是無法編譯動態連線庫的。 2,我使用的是V

VC++動態連結(DLL)程式設計深入淺出(四)

 由於MFC擴充套件DLL匯出函式和變數的方式與其它DLL沒有什麼區別,我們不再細緻講解。下面直接給出一個MFC擴充套件DLL的建立及在應用程式中呼叫它的例子。   6.1 MFC擴充套件DLL的建立  下 面我們將在MFC擴充套件DLL中匯出一個按鈕類CSXButton(擴充套件自MFC的CButton類

C#呼叫動態連結DLL

1.概述 動態連結庫(Dynamic Linked Library):將寫好的函式存在庫中,以供其他程式開發呼叫,呼叫方式為“動態的”。 Windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態連結庫中。其中有3個最重要的DLL,Kerne

VC中使用動態連結DLL:靜態呼叫和動態呼叫

VC中生成DLL的辦法見:www.codeproject.com/KB/DLL/RegDLL.aspx VC中使用DLLhttp://www.cnblogs.com/c1230v/articles/1401448.html 呼叫DLL有兩種方法:靜態呼叫和動態呼叫. (一

VC++動態連結(DLL)程式設計深入淺出(一)

 1.概論  先來闡述一下DLL(Dynamic Linkable Library)的概念,你可以簡單的把DLL看成一種倉庫,它提供給你一些可以直接拿來用的變數、函式或類。在倉庫的發展史上經歷了“無庫-靜態連結庫-動態連結庫”的時代。  靜態連結庫與動態連結庫都是共享代

【深度學習之Caffe】將模型測試Classification過程生成動態連結dll以方便其他專案呼叫

#include "caffe_classify.h"   #include "head.h"   Classifier::Classifier(const string& model_file,const string& trained_file,const string& mean

Windows環境下建立動態連結(Visual Studio版)

本篇部落格只介紹如何利用Visual Studio建立動態連結庫,至於如何使用,請參見作者上一篇部落格:Windows環境下建立並使用動態連結庫(CodeBlocks版)。 學會如何利用Visual

VS2010編寫動態連結DLL及單元測試用例

本文將建立一個簡單的動態連結庫,並編寫一個控制臺應用程式使用該動態連結庫,該動態連結庫為“JAVA呼叫動態連結庫DLL之JNative學習”中使用的DLL,只是專案及檔名稱不同。 建立動態連結庫專案:1、開啟Microsoft Visual Studio 2010,選