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