Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

получение ай пи с помощью библиотеки   Найти похожие ветки 

 
Leksiy ©   (2004-10-07 14:57) [0]

function GetLocalIP: PChar; stdcall;
 const WSVer = $101;
 var
  wsaData: TWSAData;
  P: PHostEnt;
  Buf: array [0..127] of Char;
  Begin
    Result := "";
    if WSAStartup(WSVer, wsaData) = 0 then
      begin
        if GetHostName(@Buf, 128) = 0 then
          begin
            P := GetHostByName(@Buf);
            if P <> nil then
              begin
                Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
              end;
          end;
        WSACleanup;
      end;
  End;
exports GetLocalIP;

вот такое лежит в библиотеке вызывается правильно
уже предлогали ... прото топик куда то улетел :( что надо выделить память ... не понимаю подочто и зачем ... объясните плиз ... функция если не в библиотеке работает правильно почему то не выходит именно с библиотекой


 
Григорьев Антон ©   (2004-10-07 16:56) [1]

Под результат надо выделить память. А то непонятно куда копируется, затирает какие-то полезные данные. И зачем здесь вообще PChar? Сделайте результат типом string, а результат работы Inet_NToA преобразуйте к нему с помощью StrPas.


 
XProger ©   (2004-10-07 19:24) [2]

Вот как у меня:

function NET_GetLocalIP: PChar; stdcall;
var
Error     : DWORD;
HostEntry : PHostEnt;
Address   : In_Addr;
Buffer    : array [0..63] of Char;
begin
GetHostName(Buffer, SizeOf(Buffer));
HostEntry := gethostbyname(Buffer);
Error := GetLastError;
if Error = 0 then
begin
Address := PInAddr(HostEntry^.h_addr_list^)^;
Result  := inet_ntoa(Address);
end
else
Result:="XXX.XXX.XXX.XXX";
end;

function NET_GetExternalIP: PChar; stdcall;
type
 TaPInAddr = Array[0..10] of PInAddr;
 PaPInAddr = ^TaPInAddr;
var
 phe           : PHostEnt;
 p             : PaPInAddr;
 Buffer        : array[0..63] of Char;
 i             : Byte;
begin
Result := "";
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then
Exit;
p := PaPInAddr(phe^.h_addr_list);
i := 0;
while p^[i] <> nil do
begin
Result := inet_ntoa(p^[I]^);
Inc(i);
end;
end;


 
Leksiy ©   (2004-10-08 10:37) [3]

всем спасибо то что у меня было прекрасно работает :) ... Григорьев Антон специально для вас ... библиотеки плохо работаю с типом стринг ... :) так бы не парился... кстати ничего там не трется :) топик кил


 
sniknik ©   (2004-10-08 11:09) [4]

> всем спасибо то что у меня было прекрасно работает :) ...
ну да конечно, теперь работает... ;)

> Григорьев Антон специально для вас ... библиотеки плохо работаю с типом стринг ... :)
с типом стринг замечательно работают, только менеджер памяти должен быть общим с программой. (читай предупреждения когда dll создаеш)

> топик кил
еще одно поспешное решение. ;о) здесь так не бывает. закончат только когда всем надоест.


 
Григорьев Антон ©   (2004-10-08 11:41) [5]

Ребята, ну почитайте вы MSDN, прежде чем писать код!

The string returned by inet_ntoa resides in memory that is allocated by Windows Sockets. The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread—but no longer.

Вольный перевод на русский язык: память, которую функция inet_ntoa резервирует для строки, осводождается при вызове следующей функции сокетной библиотеки из данной нити. Это означает, что буфер, который создан функцией inet_ntoa, можно использовать только для того, чтобы быстренько переписать из него данные в постоянный буфер и забыть о его существовании. А не передавать этот буфер дальше по цепочке, как вы делаете.



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.056 c
3-1100857001
Fishka
2004-11-19 12:36
2004.12.19
Поле типа Memo - при больших объемах ошибка!


1-1102024978
Shnabs
2004-12-03 01:02
2004.12.19
Графика


1-1102435699
yanker
2004-12-07 19:08
2004.12.19
Сохранение экземляра класса в файл


1-1102101970
Muhan
2004-12-03 22:26
2004.12.19
Хочу чтобы моей пользовались только по серийнику ...


4-1099829125
SPeller
2004-11-07 15:05
2004.12.19
Combobox