Текущий архив: 2007.06.10;
Скачать: CL | DM;
ВнизIpConfig /release Найти похожие ветки
← →
psa247 © (2006-11-22 09:03) [0]Доброго всем !
Помогите разобраться почему при выполнении данной процедуры выскакивает сообщение об access violation, что не так сделал ?
type
PIP_ADAPTER_INDEX_MAP = ^IP_ADAPTER_INDEX_MAP;
IP_ADAPTER_INDEX_MAP = record
Index : ULONG;
Name : array [0..MAX_ADAPTER_NAME_LENGTH + 4] of char;
end;
type
PIP_INTERFACE_INFO = ^IP_INTERFACE_INFO;
IP_INTERFACE_INFO = record
NumAdapters : ULONG;
Adapter : array[0..5] of IP_ADAPTER_INDEX_MAP;
end;
function IpReleaseAddress(pAdapterInfo : PIP_ADAPTER_INDEX_MAP): DWORD; stdcall; external "Iphlpapi.dll" name "IpReleaseAddress";
procedure release_IP(ind : cardinal);
var InterfaceInfo : PIP_INTERFACE_INFO;
Len : ULONG;
Res : DWORD;
begin
Len:= sizeof(InterfaceInfo);
GetMem(InterfaceInfo, Len);
try
Res:= GetInterfaceInfo(InterfaceInfo, @Len);
if Res = ERROR_INSUFFICIENT_BUFFER then begin//ERROR_BUFFER_OVERFLOW then begin
FreeMemory(InterfaceInfo);
GetMem(InterfaceInfo, Res);
if GetInterfaceInfo(InterfaceInfo, @Len) = ERROR_SUCCESS then begin
Res:= IpReleaseAddress(@InterfaceInfo^.Adapter[ind]); <- в этой строке
if Res = NO_ERROR then Mess("Release IP-adress complete successfully")
else Mess("Error Release IP-adress: "+ SysErrorMessage(Res));
end;
end;
finally
FreeMem(InterfaceInfo);
end;
end;
← →
Anatoly Podgoretsky © (2006-11-22 09:23) [1]> psa247 (22.11.2006 09:03:00) [0]
// var InterfaceInfo : PIP_INTERFACE_INFO;
var InterfaceInfo : IP_INTERFACE_INFO;
..
// GetMem(InterfaceInfo, Len);
// FreeMem(InterfaceInfo);
И так далее
← →
psa247 © (2006-11-22 11:43) [2]
> Anatoly Podgoretsky © (22.11.06 09:23) [1]
Я немного не понял.
Судя по описанию:
pIfTable
[out] Pointer to a buffer that specifies a IP_INTERFACE_INFO structure that receives the list of adapters. This buffer should be allocated by the caller.
Тогда зачем убирать ?
← →
Anatoly Podgoretsky © (2006-11-22 12:01) [3]> psa247 (22.11.2006 11:43:02) [2]
> This buffer should be allocated by the caller.
А я что предложил, статически распределенный буфер, который не вызовет проблемы в твоем коде, посколько ты не умеешь работать с указателями, то тебе надо избегать динамического выделения памяти
← →
Сергей М. © (2006-11-22 12:07) [4]
> psa247 © (22.11.06 09:03)
Как думаешь, чему равно значение sizeof(InterfaceInfo), если InterfaceInfo : PIP_INTERFACE_INFO
← →
Anatoly Podgoretsky © (2006-11-22 12:12) [5]> Как думаешь, чему равно значение sizeof(InterfaceInfo),
> если InterfaceInfo : PIP_INTERFACE_INFO
Ничего страшного, далее есть это
GetMem(InterfaceInfo, Res);
Но строчка лишняя, надо просто присвоить 0
← →
psa247 © (2006-11-22 12:59) [6]
> Anatoly Podgoretsky © (22.11.06 12:12) [5]
Разъясните, пожалуйста, подробнее.
← →
Anatoly Podgoretsky © (2006-11-22 13:39) [7]Первый вызов даст ошибку и вернет размер, а второй вызов уже установит данный размер. Обычная методика, когда размер неизвестен.
Правда если судить по коду, размер известен еще до вызова функции.
← →
psa247 © (2006-11-22 13:54) [8]
> Anatoly Podgoretsky © (22.11.06 13:39) [7]
Да, так и делал. Эта процедура описана в MSDN.
Взял за основу С-шный вариант с MSDN IpHelper-functions.
Только вот, не работает и решил обратиться за помощью на форум.
← →
Anatoly Podgoretsky © (2006-11-22 14:00) [9]> psa247 (22.11.2006 13:54:08) [8]
Ты не умеешь работать с указателями, кроме того сомневаюсь, что в MSDN она в таком виде.
← →
Alexander Panov © (2006-11-22 17:44) [10]еще:
Вместо
GetMem(InterfaceInfo, Len); - New(InterfaceInfo);
FreeMem(InterfaceInfo); - Dispose(InterfaceInfo);
← →
psa247 © (2006-11-26 11:06) [11]Добрый день !
Надо разобраться, к сожалению, не получилось у меня.
Если использовать New, то как заполучить память необходимого размера ?
Страницы: 1 вся ветка
Текущий архив: 2007.06.10;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.041 c