動態鏈結庫 DLL MFCDLL

2022-08-05 14:51:21 字數 1946 閱讀 8084

1.mfcdl建立

選擇mfcdll工程型別的專案,建立即可。

建立成功後,由於此dll為mfcdll,所以可以使用mfc類庫、可以新增對話方塊,功能較豐富。我在實驗中建立的mfcdll是乙個會監視usb的對話方塊dll。

工程建立完了之後,可以像mfc一樣新增對話方塊,並在對話方塊上建立類嚮導重寫虛函式、響應訊息,本次的dll(mfcdll)為usb監視的視窗,所以建立了clisten類,並重寫視窗的訊息過程函式,如下所示:

lresult clisten::windowproc(uint message, wparam wparam, lparam lparam)

if(wparam == dbt_devicearrival)

break;

} default:

break;

} return cdialog::windowproc(message, wparam, lparam);

}

之後,需要定義該mfc dll的對外介面,需要在mfcdll.cpp內定義宣告,如下所示:

extern "c" __declspec(dllexport) bool listen(bool bstart)

尤其需要注意的是,需要在介面函式內的第乙個語句處放置afx_manage_state(afxgetstaticmodulestate());,該語句是用來切換模組資源的。如果沒有該語句,那麼會在呼叫該dll的時候會出錯。定義了對外介面之後,需要在dll的def檔案中宣告該匯出函式,直接新增該函式名字就可以了,如下所示:

; mfcdll.def : 宣告 dll 的模組引數。

library

exports

; 此處可以是顯式匯出

listen

這樣,乙個mfc的dll便完成了。

由mfc的dll建立可以發現,他的過程和non-mfcdll有不同點的,non-mfc的dll的匯出函式的宣告是在標頭檔案中,而mfc的則是在def'檔案中,不過mfc應該也可以使用non-mfc的方式的。此外需要注意的是在mfc的對外介面函式內新增哪一行模組資源切換語句。

2.mfc的dll的呼叫

對於mfc的dll的使用一般使用顯示呼叫方法,這和non-mfcdll一樣,不過可以發現mfc的dll既可以被mfc的程式呼叫,也可以被控制台的程式呼叫。部分呼叫**如下:

mfc程式呼叫

void cmfcloadalldlg::onbnclickedbutton2()

//宣告匯出函式指標

plisten plistenproc = null;

//通過getprocaddress獲取匯出函式位址並賦值給指標

plistenproc = (plisten)::getprocaddress(hdll, "listen");

//檢查獲取情況,成功,則呼叫函式

if(plistenproc == null)

else

//釋放載入的dll

::freelibrary(hdll);

}

控制台應用程式呼叫

//mfc dll

void testmfcdll()

//宣告匯出函式指標

plisten plistenproc = null;

//通過getprocaddress獲取匯出函式位址並賦值給指標

plistenproc = (plisten)::getprocaddress(hdll, "listen");

//檢查獲取情況,成功,則呼叫函式

if(plistenproc == null)

else

//釋放載入的dll

::freelibrary(hdll);

}

執行結果如下圖所示:

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...