CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Sprawdzanie zewnętrznego adresu IP

Sprawdzanie zewnętrznego adresu IP

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Sprawdzanie zewnętrznego adresu IP

Nowy postprzez borysewicz » poniedziałek, 27 września 2010, 23:42

Potrzebuję pomocy w sprawdzaniu zewnętrznego IP zrobiłem dokładnie tak jak jest napisane tu:
Sprawdzanie zewnętrznego adresu IP.
http://cyfbar.republika.pl/siec.html#siec8

dodałem do projektu wininet.lib

mimo wszytko pokazuje mi takie błądy:

[BCC32 Error] Unit2.cpp(16): E2034 Cannot convert 'wchar_t *' to 'const char *'
Full parser context
Unit2.cpp(9): parsing: AnsiString GetExternalIP()
[BCC32 Error] Unit2.cpp(16): E2342 Type mismatch in parameter 'lpszAgent' (wanted 'const char *', got 'wchar_t *')
Full parser context
Unit2.cpp(9): parsing: AnsiString GetExternalIP()



Te blędy dodtycza tej linii:
KOD cpp:     UKRYJ  
hSession = InternetOpen(Application->Name.c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
 


Czy ja aby w dobry miejscu wstawiłem ten kod?
cały kod:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include <wininet.h>

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


AnsiString GetExternalIP(void)
{
 AnsiString ip = "";
 AnsiString Url = "http://dynupdate.no-ip.com/ip.php";

 DeleteUrlCacheEntry(Url.c_str());

 HINTERNET hSession;
 hSession = InternetOpen(Application->Name.c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
 if(hSession)
 {
  HINTERNET hService;
  hService = InternetOpenUrl(hSession, Url.c_str(), NULL, 0, 0, 0 );
  if(hService)
  {
   while(1)
   {
        char lpBuffer[1024 + 1];
        DWORD dwBytesRead;
        InternetReadFile(hService, lpBuffer, 1024, &dwBytesRead);
        if(dwBytesRead == 0) break;
        lpBuffer[dwBytesRead] = 0;
        ip += lpBuffer;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return ip;
}

TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
 Label1->Caption = "Zewnętrzny adres IP: " + GetExternalIP();
}
//---------------------------------------------------------------------------
 


Z góry dziekuje za pomoc
Pozdrawiam
Avatar użytkownika
borysewicz
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): czwartek, 23 września 2010, 09:53
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: Embarcadero RAD Studio 2010
C++ Builder 2010
Gadu Gadu: 0
    Windows XPOpera

Konwersje AnsiString i UnicodeString do char wchar_t

Nowy postprzez Cyfrowy Baron » wtorek, 28 września 2010, 09:31

Porada była pisana dla starszych wersjach środowiska w których domyślnym typem zmiennych są AnsiString i char. Począwszy od środowiska RAD Studio 2009 domyślnymi typami są UnicodeString i wchar_t, to wymaga jednak innych metod konwersji danych. Na samym początku zmień w ustawieniach projektu (menu: Project -> Options -> Directories and Conditionals) opcję _TCHAR maps to char na wchar_t:
wchat_t.png


W ten sposób wszędzie tam gdzie to możliwe zamiast typu char będzie używany typ wchar_t co ułatwi konwersję z UnicodeString. Tutaj od razu dodam, że jeżeli definiujesz w programie zmienną typu AnsiString to jest to rzeczywiście ten typ, ale jeżeli definiujesz zmienną typu String, to inaczej niż to jest w starszych wersjach środowiska, jest to typ UnicodeString. Tak więc wszędzie tam, gdzie w starszych wersjach środowiska dokonywano konwersji ze String (AnsiString) na char, w nowszych wersjach dokonuje się konwersji ze String (UnicodeString) do wchar_t (_TCHAR maps to char = wchar_t) lub do char (_TCHAR maps to char = char).

Co się tyczy samego problemu to zmiany ograniczają się do zastąpienia zmiennej typu AnsiString typem UnicodeString, czyli można wpisać UnicodeString lub po prostu String lub do zmiany metod konwersji. Druga zmiana nie jest konieczna i ogranicza się w zasadzie do zamiany funkcji c_str() na t_str(). Tutaj istotna uwaga jeżeli _TCHAR maps to char jest ustawione na char to musisz użyć funkcji c_str(), gdyż niektóre funkcje będą oczekiwały typu char, a nie wchar_t, ale np. funkcja Application->MessageBox zawsze oczekuje wchar_t, lecz zależnie od mapowania trzeba używać c_str() lub t_str(). Funkcja c_str() przy takim ustawieniu mapowania zwraca typ char, podczas gdy funkcja t_str() zawsze zwraca typ wchar_t. Jeżeli jednak _TCHAR maps to char jest ustawione na wchar_t to możesz użyć obydwu funkcji, gdyż przy takim ustawieniu funkcja c_str() zawsze zwraca wchar_t, a funkcja t_str() zawsze zwraca wchar_t. Zalecam używanie moetody c_str(), gdyż gdybyś w przyszłości musiał zmienić mapowania na char to nie będziesz musiał zmieniać funkcji t_str() na c_str().
Przy mapowaniu ustawionym na char możesz łatwo dokonywać konwersji z AnsiString na char poprzez użycie funkcji c_str(), czyli jak w starych wersjach środowiska, oraz konwersji z UnicodeString do char również za pomocą funkcji c_str(). Trochę to zagmatwane i trzeba się orientować z jakim typem zmiennych masz do czynienia, dlatego sugeruje używać zawsze jednego typu mapowania na wchar_t o ile nie ma innej potrzeby.

Trzy możliwe rozwiązania problemu:

_TCHAR maps to char = char
KOD cpp:     UKRYJ  
AnsiString GetExternalIP(void)
{
 AnsiString ip = "";
 AnsiString Url = "http://dynupdate.no-ip.com/ip.php";

 DeleteUrlCacheEntry( Url. c_str());

 HINTERNET hSession;
 hSession = InternetOpen(Application-> Name.t_str(), INTERNET_OPEN_TYPE_DIRECT,
                         NULL, NULL, 0 );
 if(hSession)
 {
  HINTERNET hService;
  hService = InternetOpenUrl(hSession, Url.c_str(), NULL, 0, 0, 0 );
  if(hService)
  {
   while(1)
   {
        char lpBuffer[1024 + 1];
        DWORD dwBytesRead;
        InternetReadFile(hService, lpBuffer, 1024, &dwBytesRead);
        if(dwBytesRead == 0) break;
        lpBuffer[dwBytesRead] = 0;
        ip += lpBuffer;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return ip;
}


_TCHAR maps to char = wchar_t o ile chcesz używać typu AnsiString, należy użyć do konwersji z AnsiString do wchar_t funckji WideString(AnsiString s).c_bstr()
KOD cpp:     UKRYJ  
AnsiString GetExternalIP(void)
{
 AnsiString ip = "";
 AnsiString Url = "http://dynupdate.no-ip.com/ip.php";

 DeleteUrlCacheEntry( WideString(Url).c_bstr());

 HINTERNET hSession;
 hSession = InternetOpen(Application->Name.t_str(), INTERNET_OPEN_TYPE_DIRECT,
                         NULL, NULL, 0 );
 if(hSession)
 {
  HINTERNET hService;
  hService = InternetOpenUrl(hSession, WideString(Url).c_bstr(), NULL, 0, 0, 0 );
  if(hService)
  {
   while(1)
   {
        char lpBuffer[1024 + 1];
        DWORD dwBytesRead;
        InternetReadFile(hService, lpBuffer, 1024, &dwBytesRead);
        if(dwBytesRead == 0) break;
        lpBuffer[dwBytesRead] = 0;
        ip += lpBuffer;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return ip;
}



_TCHAR maps to char = wchar_t znacznie prostsze przy użyciu zmiennej typu UnicodeString:
KOD cpp:     UKRYJ  
String GetExternalIP(void)
{
 String ip = "";
 String Url = "http://dynupdate.no-ip.com/ip.php";

 DeleteUrlCacheEntry(Url.t_str());

 HINTERNET hSession;
 hSession = InternetOpen(Application->Name.t_str(), INTERNET_OPEN_TYPE_DIRECT,
                         NULL, NULL, 0 );
 if(hSession)
 {
  HINTERNET hService;
  hService = InternetOpenUrl(hSession, Url.t_str(), NULL, 0, 0, 0 );
  if(hService)
  {
   while(1)
   {
        char lpBuffer[1024 + 1];
        DWORD dwBytesRead;
        InternetReadFile(hService, lpBuffer, 1024, &dwBytesRead);
        if(dwBytesRead == 0) break;
        lpBuffer[dwBytesRead] = 0;
        ip += lpBuffer;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return ip;
}
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
borysewicz
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Sprawdzanie zewnętrznego adresu IP

Nowy postprzez borysewicz » wtorek, 28 września 2010, 15:53

Dziękuje za kompleksową odpowiedz 8-)
Avatar użytkownika
borysewicz
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): czwartek, 23 września 2010, 09:53
Podziękował : 5
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: Embarcadero RAD Studio 2010
C++ Builder 2010
Gadu Gadu: 0
    Windows XPOpera


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość