例程詳析動態連結庫 (轉)
例程詳析動態連結庫
bull77
動態連結庫(DLL,即 Dynamic-Link Library)是可的模組,但它沒有自己的堆疊,必須在動態連結庫的
環境下執行。動態連結庫不僅可以作為一個執行模組,包括函式程式碼,而且可以包含程式以外的任何資料或資源(點陣圖、圖示
等等)。動態連結庫就是給應用程式提供函式或者資源。
動態連結與靜態連結是相對立的。靜態連結的時候,可執行程式內包含了所訪問的函式的程式碼,可執行程式佔用的空間較
大;但執行時,不需要其他模組支援,從而速度相對較快。動態連結的可執行程式中不包含動態訪問的函式程式碼,僅僅包含對
它的參考,執行時需要其他模組(DLL)的支援,速度相對較慢。
動態連結庫是的一種極其重要的技術。它使得開發人員可以透過編寫動態連結庫,方便靈活的實現大型程式的開
發,按自己的意願對操作進行擴充套件。
下面透過例子介紹如何在動態連結庫中定義函式、資源、和類以及如何在工程中使用動態連結庫中已定義的函式、資源、
類。
一、 函式的定義和使用方法:
第一步:
執行AppWizard,定義專案名為mydll,選擇MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在這個例子中,只有一個AppWizard螢幕出現,選擇MFC擴充套件DLL(MFC Extension DLL (using shared MFC DLL),點選
FINISH生成工程。
第三步:
點選File中的New,選擇C/C++ Header File,File Name中輸入dll,點選OK,建立dll.h。輸入extern "C" __declspec(dllexport)
int fun(int x1,int x2,int x3); ,儲存。
第四步:
點選File中的New,選擇C++ File,File Name中輸入dll,點選OK,建立dll.cpp。輸入
#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
編譯生成mydll.dll和mydll.lib。
第五步:
選擇Project 中Add To Project 中的New , 重新生成一個工程,選擇MFC AppWizards(exe),專案名為mydlltest , 選擇Single
Document ,點選FINISH,生成一個新的工程。選擇選單中的Project àSet Active Project àmydlltest ,將mydlltest設為當前活動工程
。
第六步:
複製…mydlldemydll.dll 到 ..mydlltestdebug下,複製…mydlldebugmydll.lib到…mydlltest目錄下。
第七步:
在mydlltestView.cpp中的#endif下新增
extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void CMydlltestView::OnDraw(CDC* pDC)中新增程式碼如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int x=fun(1,2,3);
CString str;
str.Format("%d",str);
pDC->TextOut(10,10,x);
}
第八步:
在WorkSpace中的mydlltest files上點選右鍵,選擇Add files to Project ,將mydll.dll新增到工程。
好了,我們的工作做完了,執行一下看看吧!
二、 類的新增和使用步驟:
在mydll中生成一個新類,類的宣告處改為class AFX_EXT_CLASS CMyClass ,在此類中和其他類一樣新增自己需要的變數
和函式,編譯生成新的dll和lib,重複上面的第六步,在mydlltest中利用上面的方法生成一個myclass.h,複製mydll中
myclass.h的所有程式碼到新生成的myclass.h中。在需要使用dll中CmyClass類的檔案中包含myclass.h,然後我們就可以向其他類
一樣使用該類了。
三、 字串的定義和使用
在mydll中定義字串資源,編譯生成新的dll和lib,重複上面的第六步,在mydlltest中的myclass.h中新增 #define IDS_MYSTR
1(假設我們定義的字串資源的ID號為IDS_MYSTR),在需要是要該字串的地方新增#include "myclass.h",即可使用該字
符串了。
CString str2;
str2.LoadString(IDS_MYSTR);
四、 對話方塊的定義和使用
在mydll中定義對話方塊資源,生成一個新類CDlg,類的宣告處改為class AFX_EXT_CLASS CDlg : public CDialog ,像其他對
話框一樣定義對話方塊的屬性和功能,編譯生成新的dll和lib,重複上面的第六步,在mydlltest中利用上面的方法生成一個dlg.h檔案
,複製mydll中dlg.h的所有程式碼到新生成的dlg.h中。在需要使用dll中此對話方塊資源的檔案中包含dlg.h,然後我們就可以向其他
對話方塊一樣使用此對話方塊了。
CDlg dlg;
dlg.odal();
好了,到這裡我們所有的功能就都實現了,快編譯執行一下吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-998615/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 動態連結庫與靜態連結庫
- cmake 連結動態連結庫
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- 【連結 1】與靜態連結庫連結
- 載入動態連結庫——dlopen dlsym dlclose
- C#呼叫C++動態連結庫C#C++
- 動態連結庫的生成和使用(二)
- 動態連結庫(DLL)的建立和使用
- JAVA動態繫結淺析Java
- 如何連結兩個名字一樣動態庫
- Android NDK祕籍--淺析靜態庫和動態庫Android
- Linux共享庫、靜態庫、動態庫詳解Linux
- 在 Linux中如何使用動態連結模組庫?Linux
- P/Invoke之C#呼叫動態連結庫DLLC#
- 靜態連結動態連結的連結順序問題和makefile示例
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- PHP獲取動態跳轉後的真實連結PHP
- 使用js動態新增連結隨機連結JS隨機
- Gazebo新增模型並控制模型運動作為動態障礙物(Ubuntu16.04, Gazebo7.16),附錄動態連結庫和靜態連結庫區別模型Ubuntu
- IIS無法訪問動態連結庫DLL的原因
- 採用libpq連結lightdb示例程式
- 動態連結的相關結構
- 編譯 pyav 成 wheel 並使用 auditwheel 固化動態連結庫編譯
- JNI呼叫c動態連結庫函式程式碼實踐函式
- [pwn基礎]動態連結原理
- 動態連結的PLT與GOTGo
- 用動態連結動態洩露system地址並利用
- FFmpeg開發筆記(四)FFmpeg的動態連結庫介紹筆記
- 【技術向】Linux動態連結庫預載入型後門Linux
- Linux環境下:程式的連結, 裝載和庫[靜態連結]Linux
- 關於動態連結串列的理解
- 動態連結串列的建立(程式碼)
- 華為AppGallery常用跳轉與連結詳解APP
- Java單連結串列反轉圖文詳解Java
- 安卓動態連結庫檔案體積最佳化探索實踐安卓
- windows和linux gcc生成動態連結庫DLL和SO並用python呼叫WindowsLinuxGCPython
- Windows環境下,動態連結庫(DLL)的“匯入”與“匯出”概念Windows
- 動態連結的步驟與實現
- 硬連結與軟連結詳解