Главная страница
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.026 c
14-1101821971
AlexG
2004-11-30 16:39
2004.12.19
Великий демократический (крестовый) поход!


14-1101560486
OneFragLeft
2004-11-27 16:01
2004.12.19
Пришла идея, что даже вылез из за стола (ужинал)


14-1101728392
КаПиБаРа
2004-11-29 14:39
2004.12.19
А зачем все время ИМХО приписывать?


14-1101811612
sirsergio
2004-11-30 13:46
2004.12.19
Помогите найти DevExpress ExpressDBTree Suite. Плиззз.


3-1100789541
serg9
2004-11-18 17:52
2004.12.19
Редактировать DBGrid подключен к интербазе через квери.