2012-09-02 65 views
0
SendMessage(hIpControl, IPM_GETADDRESS, 0, (LPARAM)lpIPAddress); 
    TextOut(hdc, 10, 10, (LPCWSTR)lpIPAddress , 20); 
//where static LPDWORD lpIPAddress = (LPDWORD)malloc(sizeof(LPDWORD)); 

和 hIpControl是IP控制的句柄。當我運行這個時,文本輸出只顯示隨機中文符號和東西。如何安全地檢索IP地址並將其存儲在字符串中。我需要使用像「192.168.1.4」這樣的字符串才能讓我的應用程序工作。從IP地址控制中檢索文本c

+2

「由於編譯器無法轉換參數,因此我們給它一些幫助並在前面粘貼一個演員表。 [在那裏,關閉編譯器](http://blogs.msdn.com/b/oldnewthing/archive/2009/10/23/9911891.aspx)。那些編譯器傢伙很愚蠢。他們甚至無法弄清楚如何將一個指針轉換爲另一個指針。我敢打賭,當他們去洗手間時,他們需要幫助擦掉他們的菸頭。「([Source](http://blogs.msdn.com/b/oldnewthing/archive/2011/05/06/10161590.aspx)) –

+1

@ Adam:對於傳統的Windows消息,你必須使用強制轉換,這些都不是類型保存。 –

+1

@Ole:對於SendMessage等的'WPARAM'和'LPARAM'參數,是的,這是不幸的,但對於'TextOut'的字符串參數?「請給我一個空終止的寬字符串」不應該用「Ok,這是一個32位整數,但我保證它真的是一個空終止的寬字符串,mkay?」。 –

回答

4

IPM_GETADDRESS將地址作爲DWORD返回,而不是字符串。

DWORD dwAddr; 
int iCount = (int)SendMessage(hwndCtl, IPM_GETADDRESS, 0, (LPARAM)&dwAddr); 
wchar_t wchAddr[20]; 
StringCchPrintf(wchAddr, _countof(wchAddr), L"%ld.%ld.%ld.%ld", 
    FIRST_IPADDRESS(dwAddr), 
    SECOND_IPADDRESS(dwAddr), 
    THIRD_IPADDRESS(dwAddr), 
    FOURTH_IPADDRESS(dwAddr)); 

注意,有可能爲用戶輸入不是全部四個四邊形較少(iCount在上面的例子包含四邊形的數量返回),所以你需要在現實生活中考慮到這一點。

3

這會給你所有4個字段成字符串。

DWORD lpIPAddress; 

LRESULT SM = SendMessage(hWndIPAddress, IPM_GETADDRESS, 0, (LPARAM)(LPDWORD)&lpIPAddress); 

BYTE IPPart1 = FIRST_IPADDRESS((LPARAM)lpIPAddress); 
BYTE IPPart2 = SECOND_IPADDRESS((LPARAM)lpIPAddress); 
BYTE IPPart3 = THIRD_IPADDRESS((LPARAM)lpIPAddress); 
BYTE IPPart4 = FOURTH_IPADDRESS((LPARAM)lpIPAddress); 


AnsiString ip = AnsiString(IPPart1) + AnsiString(".") + 
       AnsiString(IPPart2) + AnsiString(".") + 
       AnsiString(IPPart3) + AnsiString(".") + 
       AnsiString(IPPart4); 

ShowMessage("IP Address " + ip); 

參考:http://www.functionx.com/cppbuilder/controls/ipaddress.htm

2
DWORD IPAddress; 
SendMessage(hIpControl, IPM_GETADDRESS, 0, (LPARAM)&IPAddress); 
WCHAR Buff[500]; 
sprintf(Buff, "%d.%d.%d.%d", (int)FIRST_IPADDRESS(IPAddress), (int)SECOND_IPADDRESS(IPAddress), (int)THIRD_IPADDRESS(IPAddress), (int)FOURTH_IPADDRESS(IPAddress)); 
TextOut(hdc, 10, 10, Buff , 20); 

或者,也許你必須改變首先奧德到第四 - 不知道到底:-) 在這裏看到: http://msdn.microsoft.com/en-us/library/windows/desktop/bb761378%28v=vs.85%29.aspx

0

這裏一個簡單的函數這應該工作好(如它對我來說):

void getIpAddress(HWND hDlg) 
{ 
    int len = GetWindowTextLength(GetDlgItem(hDlg, IDC_IPADDRESS_INPUT)); 
    if (len > 0) 
    { 
     char *buffer; 
     buffer = (char*)GlobalAlloc(GPTR, len + 1); 
     GetDlgItemTextA(hDlg, IDC_IPADDRESS_INPUT, buffer, len + 1); 
     MessageBoxA(0, buffer, "Ip Address", MB_OK); 
    } 
    else 
    { 
     // Error handling here 
    } 
}