VC2008如何生成及使用DLL 完整版

2021-06-26 00:55:54 字數 3515 閱讀 5733

生成、使用dll看起來簡單,但做起來才發現還是有一些地方需要注意的。

1. 開啟vs2008,新建乙個vc工程,選擇win32型別,win32專案:

2. 應用程式型別選擇dll,附加選項選擇到處符號,公共標頭檔案不要選擇,然後點完成即可。

3. 工程生成後需要修改屬性,在配置屬性的常規選項中將mfc的使用修改為「靜態庫中使用mfc」。

注意,這一步是必須的,否則寫出來的dll將需要在有vc2008的環境上才能執行。

4. 關注自動生成的檔案mydlltest.cpp,其中有幾個例項,可以將他們刪除,也可以不管他們。

5. 新增自己的介面,如:getmydllversion

// 得到當前dll的版本號

mydlltest_api uint32

getmydllverion(

void

)    

6. 在標頭檔案mydlltest.h中新增宣告

mydlltest_api 

uint32

getmydllverion(

void

);  

7. 新增匯出符號定義檔案,理論上是可以不要匯出定義的,但是那樣的結果就是生成的dll中的符號名字不明確,只有定義了匯出符號,才可以使得dll中的藉口函式名稱得以確定。(關於def與dll 請參閱msdn )

檔案內容:

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

library 

"mydlltest"

exports   

getmydllverion  

8. 在專案屬性中設定模組定義檔案為剛才建立的symexport.def檔案:

9. 生成,可以得到乙個mydlltest.dll,使用depends工具(vc6.0自帶)可以檢視這個dll中包含了多少介面以及介面名:

會發現除了我們定義的藉口getmydllversion外還有幾個??開頭的介面,他們就是那些沒有在模組定義檔案中定義的藉口自動生成的。

10. 除了dll外我們還會發現生成了mydlltest.lib檔案,這個lib檔案可以在其他的程式使用這個dll的時候將其連線進去,同時只要包含mydlltest.h即可呼叫這個dll中的藉口了。

如何引入dll

方法一.裝載期間動態載入。(需要lib和dll)

1。新建win32應用程式空專案。

2。把生成的dll、lib這2個檔案複製到新建的目錄下。

3。新增導入庫:工具--專案和解決方案(vs裡是options)--vc++目錄,選擇右側「顯示以下內容的目錄」下的「庫檔案」,把lib所在目錄新增。

4。標頭檔案: mydlltest.h(與編寫dll中一樣)

5。原始檔:main.c

可注釋#pragma comment(lib," mydlltest.lib")這條,但必須設定鏈結庫,方法:

#include "

mydlltest.h"

#include "

windows.h"

#pragma comment(lib,"

mydlltest.lib")

intwinapi winmain(__in 

hinstance

hinstance, __in_opt 

hinstance

hprevinstance, __in_opt 

lpstr

lpcmdline, __in 

intnshowcmd )    

方法二:執行期間動態載入。(只需dll檔案即可)

需要使用 windows api 函式: loadlibrary 、 getprocaddress 以及 freelibrary

#include

#include

using namespace std;

//定義functionfunc為指向乙個返回值為int型 無引數的函式的指標

typedef int (*functionfunc)();

有時候我們拿到的是別人的dll和標頭檔案,但是卻沒有lib檔案,這時就要使用另外的方法呼叫dll中的介面了,例如md5介面的使用:

// 按照msdn中的說明定義函式原型如下

typedef

struct

md5_ctx;  

typedef

void

(callback* md5init_tpye)(md5_ctx* context);  

typedef

void

(callback* md5update_tpye)(md5_ctx* context,   

unsigned char

* input,   

unsigned int

inlen);  

typedef

void

(callback* md5final_tpye)(md5_ctx* context);  

// 使用md5介面

hinstance

hdll;  

// md5介面是在cryptdll.dll中的

hdll = loadlibrary(text("cryptdll.dll"

));  

md5init_tpye md5init;  

md5update_tpye md5update;  

md5final_tpye md5final;  

// 得到介面指標

md5init = (md5init_tpye)getprocaddress(hdll, "md5init"

);  

md5update = (md5update_tpye)getprocaddress(hdll, "md5update"

);  

md5final = (md5final_tpye)getprocaddress(hdll, "md5final"

);  

if(!md5init || !md5update || !md5final)  

md5_ctx md5_context;  

md5init(&md5_context);  

md5update(&md5_context, src, length);  

md5final(&md5_context);  

// 不要忘記釋放匯入的dll

freelibrary(hdll);  

這就是目前我知道的兩種使用dll的方法了,至於還有沒有其他的方法,暫時沒有這方面的需求,也就不去花腦力想了。。。

使用VC2008中ATL開發瀏覽器控制項

2011.03.02 freecnjet gmail.com 本文將介紹使用vc2008中的atl開發乙個用於網路部署的cab控制項包的過程。開啟vs2008,建立乙個atl專案,如下圖 考慮到簡介性,選擇了 allow merging of proxy stub code 建議先編譯一下真個pro...

VC 2008中使用自帶水晶報表和打包

一 新建乙個基於對話方塊 mfc的應用程式工程,然後向對話方塊中插入控制項 crystal activexreport viewer control 10.5 向工程中新增 crystalreportviewer10.h crystalreportviewer10.cpp crvtrackcurso...

VC2008使用中不能輸入中文的解決方法

在使用vs2008開發軟體中有時不能輸入中文,當然重啟一次又可以,這個問題我上網查閱了很多資料也得不到解決,有人說是什麼熱鍵之間的衝突,我搞了半天也沒搞懂什麼意思,更不用說解決問題了,在長期實踐中,我發現乙個可以更好解決這個問題的方法。輸入法最好使用兩種,比如我就使用了 谷歌輸入法 和 搜狗輸入法 ...