Форум: "Сети";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Внизполучение ай пи с помощью библиотеки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c