//機器名 char* GetHostName(void); //系統類型 char* GetSystemType(void); //IP地址 void GetIPAddressList(char ** lpIPList,DWORD *lpNumber); |
//機器名 char* CTestDLLApp::GetHostName(void) { char* lpsz = new char[1024]; m_SystemInfo.GetHostName(lpsz); return lpsz; } //系統類型 char* CTestDLLApp::GetSystemType(void) { char* lpsz = new char[1024]; m_SystemInfo.GetlSystemType(lpsz); return lpsz; } //IP地址 void CTestDLLApp::GetIPAddressList(char ** lpIPList,DWORD *lpNumber) { m_SystemInfo.GetIPAddressList(lpIPList,lpNumber); } |
// 唯一的一個 CTestDLLApp 對象 CTestDLLApp theApp; 的后面添加輸出的DLL函數,函數定義如下: /******************* 在這里添加輸出函數 ***************************/ /******************************************** 函數名稱:GetHostName 功能:獲取本機的機器名稱 返回:strHostName-本機機器名稱 *********************************************/ extern "C" _declspec(dllexport) void GetHostName(LPTSTR strHostName ) { //如果是傳遞字符串需要使用strcpy拷貝字符串的地址,而不能直接等于。 strcpy(strHostName,theApp.GetHostName()); } /******************************************** 函數名稱:GetSystemType 功能:獲取本機操作系統版本 返回:strSystemType-本機操作系統版本 *********************************************/ extern "C" _declspec(dllexport) void GetSystemType(char * strSystemType) { strcpy(strSystemType,theApp.GetSystemType()); } /******************************************** 函數名稱:GetIPAddressList 功能:獲取本機的IP地址 返回:lpIPList-本機的IP地址數組,lpNumber IP地址個數 *********************************************/ extern "C" _declspec(dllexport) void GetIPAddressList(char ** lpIPList,DWORD *lpNumber) { theApp.GetIPAddressList(lpIPList,lpNumber); } |
為了讓DemoTestDLL能夠調用TestDLL.dll程序,需要讓前者能夠"看見" DLL程序。我們將TestDLL.dll文件考到DemoTestDLL的Debug目錄下,一個Windows程序定位DLL的次序是:
1、 包含EXE文件的目錄。
2、 進程的當前工作目錄。
3、 Windows系統目錄。
4、 Windows目錄。
5、 列在Path環境變量中的一系列目錄。
在測試DLL按鈕添加下面代碼:
void CDemoTestDLLDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 //聲明DLL函數 typedef void (_cdecl *GETHOSTNAME)(LPTSTR strHostName); typedef void (_cdecl *GETSYSTEMTYPE)(char * strSystemType); typedef void (_cdecl *GETIPADDRESSLIST)(char ** lpIPList,DWORD *lpNumber); //聲明函數句柄 HMODULE hTestDLL = NULL; GETHOSTNAME GetHostName = NULL; GETSYSTEMTYPE GetSystemType = NULL; GETIPADDRESSLIST GetIpAddressList = NULL; // 加載動態鏈接庫 hTestDLL = LoadLibrary("TestDLL.dll"); if(hTestDLL == NULL)\ { printf("cannot load LCDDLL.dll\n"); exit(0); } /*** 找到每個函數的入口 ****/ //系統名稱 GetHostName = (GETHOSTNAME)GetProcAddress(hTestDLL,"GetHostName"); if(GetHostName==NULL) { printf("cannot load process GetHostName\n"); FreeLibrary(hTestDLL); exit(1); } //操作系統類型 GetSystemType = (GETSYSTEMTYPE)GetProcAddress(hTestDLL,"GetSystemType"); if(GetSystemType==NULL) { printf("cannot load process GetSystemType\n"); FreeLibrary(hTestDLL); exit(1); } //IP地址列表 GetIpAddressList = (GETIPADDRESSLIST)GetProcAddress(hTestDLL,"GetIPAddressList"); if(GetSystemType==NULL) { printf("cannot load process GetIpAddressList\n"); FreeLibrary(hTestDLL); exit(1); } /*** 使用LPTSTR和使用char*定義的效果是一樣的 ***/ //取機器名稱 LPTSTR szHostName = new char[1024]; (*GetHostName)(szHostName); //取操作系統類型 char* szSystemType = new char[1024]; (*GetSystemType)(szSystemType); //IP Address List DWORD ipListNumber = 0; //聲明方式一 //LPTSTR* lpAddress = new LPTSTR[256]; //聲明方式二 char** lpAddress = new char*[256]; for(int i=0;i<256;i++) { lpAddress[i] = NULL; } (*GetIpAddressList)(lpAddress,&ipListNumber); //顯示在界面 m_setHostName.SetWindowText(szHostName); m_setSystemType.SetWindowText(szSystemType); //將IP添加到list 中 for(int i=0;i<ipListNumber;i++) { m_IPList.AddString(lpAddress[i]); } } |