中定義和使用牛
什么是DLL?
DLL指的是動態鏈接庫(Dynamic Link Library),它是一個可以被多個應用程序(甚至是不同語言編寫的應用程序)同時調用的可執行二進制文件,是一個可共享的庫。DLL是建立在客戶/服務器通信的概念上,包含若干函數、類或資源的庫文件,函數和數據被存儲在一個DLL(服務器)上并由一個或多個客戶導出而使用,這些客戶可以是應用程序或者是其它的DLL。
在下面我們將通過一個具體的例子來說明如何利用定義一個DLL文件,并且在的應用程序中調用,這個例子的主要功能是通過DLL獲取系統的機器名、操作系統類型和IP地址。
在中定義DLL文件
選擇菜單項,選擇文件-新建-項目,在彈出的新建項目的對話框中,選擇項目類型為Visual C++ 項目,類別為MFC的工程,在右邊的模板中,選擇MFC DLL模板,給項目取名為TestDLL,選擇好項目的位置,按確定健,進入應用程序設置。
在應用程序設置中,我們可以看到,有三種DLL類型,它們依次對應著三類DLL。
靜態DLL與共享DLL的區別是:前者使用的是MFC的靜態鏈接庫,生成的DLL文件長度大,一般不使用這種方式,后者使用MFC的動態鏈接庫,生成的DLL文件長度小;動態鏈接到MFC的共享DLL所有輸出的函數應該以如下語句開始(用于正確切換MFC模塊狀態): AFX_MANAGE_STATE(AfxGetStaticModuleState( )) 擴展DLL用來建立MFC的派生類,只被用MFC類庫所編寫的應用程序調用。常規DLL(包括靜態與動態)的一個特點是在源文件里有一個繼承CWinApp的類(從CWinApp派生,但沒有消息循環),被導出的函數是C++類或者C++成員函數,調用常規DLL的應用程序不必一定是MFC應用程序。擴展DLL和常規DLL不一樣,它沒有一個從CWinApp繼承而來的類的對象,編譯器默認了一個DLL入口函數DLLMain()作為對DLL的初始化。
另外還可以添加兩個附加功能:自動化和windows套接字,如果選擇了這兩項,程序會做一些初始化,在這里我們就不做討論了。
在這個例子里,我們選擇“使用共享的MFC DLL”。
添加代碼:
1、在工程中導入p和systeminfo.h文件,這兩個文件用來獲取本機的機器名,操作系統版本和本機IP列表,具體的定義,請參考源文件。
在TestDLL.h頭文件中,引入systemInfo.h頭文件
#include \"systemInfo.h\"
添加變量:
CSystemInfo m_SystemInfo;
2、在CTestDLLApp類中添加三個函數用戶獲取信息:
里皮迅速做出換人調整。正當恒大重新主宰了局勢 //機器名
char* GetHostName(void);
//系統類型
char* GetSystemType(void);
//IP地址
void GetIPAddressList(char ** lpIPList,DWORD *lpNumber); 函數定義如下: //機器名
char* CTestDLLApp::GetHostName(void)
{
char* lpsz = new char[1024];
m_tHostName(lpsz);
return lpsz;
}
//系統類型
char* CTestDLLApp::GetSystemType(void)
{
char* lpsz = new char[1024];
m_tlSystemType(lpsz);
return lpsz;
}
//IP地址
void CTestDLLApp::GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
{
m_tIPAddressList(lpIPList,lpNumber);
} 3、添加輸出函數:
打開TestDLL工程中的“p”文件,在: // 唯一的一個 CTestDLLApp 對象
CTestDLLApp theApp;
的后面添加輸出的DLL函數,函數定義如下:
/******************* 在這里添加輸出函數 ***************************/
/********************************************
函數名稱:GetHostName
功能:獲取本機的機器名稱
返回:strHostName-本機機器名稱
*********************************************/
extern \"C\" _declspec(dllexport) void GetHostName(LPTSTR strHostName )
{
//如果是傳遞字符串需要使用strcpy拷貝字符串的地址,而不能直接等于。
strcpy(strHostName,tHostName());
}
/********************************************
函數名稱:GetSystemType
功能:獲取本機操作系統版本
返回:strSystemType-本機操作系統版本
*********************************************/
extern \"C\" _declspec(dllexport) void GetSystemType(char * strSystemType)
{
strcpy(strSystemType,tSystemType());
}
/********************************************
函數名稱:GetIPAddressList
功能:獲取本機的IP地址
返回:lpIPList-本機的IP地址數組,lpNumber IP地址個數
*********************************************/
extern \"C\" _declspec(dllexport) void GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
{
tIPAddressList(lpIPList,lpNumber);
} 最后編譯工程文件,生成l文件。
至此,一個DLL文件已經做好了。
合肥癲癇病醫院哪家治療最好海口包皮包莖
小孩容易生病怎么辦
- 王一博說自己“全家最丑”,本以為開玩笑,看到媽媽特寫:我信了!
- 九分褲+樂福鞋,夏日這樣穿,時髦又顯高,很適合小個子
- 準備和公婆一起長住,買四室大房子,160㎡,光想就激動了!
- 60歲葉倩文穿深V蕾絲風景秀麗背!頭發花白皺紋明顯,表情搞怪做鬼臉
- 職場情商課:掌控“現像效應”,發揮積極作用,遵從自己的內心
- 北大攻克芯片世界性解決辦法,登上頂刊《自然》
- 要把暖暖的關心,換成冷冷的寒心
- 新紀元古玩藝術品在線模擬器:精品推薦——佳品磁鐵隕石
- 2022年高考本科沒錄取,專科不顧一切,選韓國留學申請本科名校
- 高于5000萬元!四川省制造業企業“制惠貸”等你申報
- 湘南學院舉行就業創業典型畢業生訪談展覽
- 北京近期48例感染者住址工作地位置圖簡述