標籤:http color os 使用 io strong for 檔案 ar
1.2.3 小試牛刀--編程實現擷取電腦的IP地址和電腦名稱(1)
執行個體功能 擷取當前電腦的IP地址和電腦名稱
源碼路徑 光碟片\yuanma\1\IP
本執行個體的目的是,使用Visual C++ 6.0開發一個擷取當前機器的IP地址和電腦名稱的應用程式。
1. 設計MFC表單
使用Visual C++ 6.0建立一個MFC項目後,根據本執行個體的需要設計兩個表單,分別是IDD_ABOUTBOX表單(見圖1-12)和IDD_IPADDRESS_DIALOG表單(見圖1-13)。
|
圖1-13 IDD_IPADDRESS_DIALOG表單 |
2. 具體編碼
設計好表單之後,接下來開始講解具體編碼過程。
(1) 在檔案IPAddressDlg.cpp中實現初始化對話方塊,使用對話方塊形式顯示擷取的IP地址和電腦名稱。具體代碼如下:
- BOOL CIPAddressDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu *pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // 設定對話方塊表徵圖
- SetIcon(m_hIcon, TRUE); // 設定大表徵圖
- SetIcon(m_hIcon, FALSE); // 設定小表徵圖
- int nRetCode;
-
- nRetCode = StartUp();
- TRACE1("StartUp RetCode: %d\n", nRetCode);
- nRetCode = GetLocalHostName(m_sHostName);
- TRACE1("GetLocalHostName RetCode: %d\n", nRetCode);
- nRetCode = GetIPAddress(m_sHostName, m_sIPAddress);
- TRACE1("GetIPAddress RetCode: %d\n", nRetCode);
- nRetCode = CleanUp();
- TRACE1("CleanUp RetCode: %d\n", nRetCode);
- UpdateData(FALSE);
- return TRUE;
- }
-
- void CIPAddressDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- void CIPAddressDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
-
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }
(2) 在檔案IPAddressDlg.cpp中編寫函數GetLocalHostName()擷取機器名,調用函數GetIPAddress()擷取機器的IP地址。具體代碼如下:
- int CIPAddressDlg::GetLocalHostName(CString &sHostName)
- {
- char szHostName[256];
- int nRetCode;
- nRetCode = gethostname(szHostName, sizeof(szHostName));
- if (nRetCode != 0) {
- sHostName = _T("Not available");;
- return WSAGetLastError();
- }
- sHostName = szHostName;
- return 0;
- }
-
- int CIPAddressDlg::GetIPAddress(const CString &sHostName,
- CString &sIPAddress)
- {
- struct hostent FAR *lpHostEnt = gethostbyname(sHostName);
- if (lpHostEnt == NULL) {
- sIPAddress = _T("");
- return WSAGetLastError();
- }
- LPSTR lpAddr = lpHostEnt->h_addr_list[0];
- if (lpAddr) {
- struct in_addr inAddr;
- memmove(&inAddr, lpAddr, 4);
- sIPAddress = inet_ntoa(inAddr);
- if (sIPAddress.IsEmpty())
- sIPAddress = _T("Not available");
- }
-
- return 0;
- }
(3) 在檔案IPAddressDlg.cpp中載入Winsock庫並釋放控制項,具體代碼如下:
- int CIPAddressDlg::StartUp()
- {
- WORD wVersionRequested;
- WSADATA wsaData;
- int err;
- wVersionRequested = MAKEWORD(2, 0);
- err = WSAStartup(wVersionRequested, &wsaData);
- if (err != 0) {
- return err;
- }
- if (LOBYTE(wsaData.wVersion) != 2
- || HIBYTE(wsaData.wVersion) != 0) {
- WSACleanup();
- return WSAVERNOTSUPPORTED;
- }
- return 0;
- }
至此整個執行個體的主要模組介紹完畢,執行後將擷取機器名和IP地址,1-14所示。
小試牛刀--編程實現擷取電腦的IP地址和電腦名稱