Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IpConfig /release [D6, WinXP]


psa247 ©   (2006-11-22 09:03:00) 

Доброго всем !

Помогите разобраться почему при выполнении данной процедуры выскакивает сообщение об 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;


psa247   (2006-11-26 11:06:00) [1]

Добрый день !

Надо разобраться, к сожалению, не получилось у меня.
Если использовать New, то как заполучить память необходимого размера ?


Alexander Panov   (2006-11-22 17:44:00) [2]

еще:

Вместо
GetMem(InterfaceInfo, Len); - New(InterfaceInfo);
FreeMem(InterfaceInfo); - Dispose(InterfaceInfo);


Anatoly Podgoretsky   (2006-11-22 14:00:00) [3]

> psa247  (22.11.2006 13:54:08)  [8]

Ты не умеешь работать с указателями, кроме того сомневаюсь, что в MSDN она в таком виде.


psa247   (2006-11-22 13:54:00) [4]


> Anatoly Podgoretsky ©   (22.11.06 13:39) [7]

Да, так и делал. Эта процедура описана в MSDN.
Взял за основу С-шный вариант с MSDN IpHelper-functions.
Только вот, не работает и решил обратиться за помощью на форум.


Anatoly Podgoretsky   (2006-11-22 13:39:00) [5]

Первый вызов даст ошибку и вернет размер, а второй вызов уже установит данный размер. Обычная методика, когда размер неизвестен.
Правда если судить по коду, размер известен еще до вызова функции.


psa247   (2006-11-22 12:59:00) [6]


> Anatoly Podgoretsky ©   (22.11.06 12:12) [5]

Разъясните, пожалуйста, подробнее.


Anatoly Podgoretsky   (2006-11-22 12:12:00) [7]

> Как думаешь, чему равно значение sizeof(InterfaceInfo),
> если InterfaceInfo : PIP_INTERFACE_INFO

Ничего страшного, далее есть это
GetMem(InterfaceInfo, Res);
Но строчка лишняя, надо просто присвоить 0


Сергей М.   (2006-11-22 12:07:00) [8]


> psa247 ©   (22.11.06 09:03)


Как думаешь, чему равно значение sizeof(InterfaceInfo), если InterfaceInfo : PIP_INTERFACE_INFO


Anatoly Podgoretsky   (2006-11-22 12:01:00) [9]

> psa247  (22.11.2006 11:43:02)  [2]

> This buffer should be allocated by the caller.

А я что предложил, статически распределенный буфер, который не вызовет проблемы в твоем коде, посколько ты не умеешь работать с указателями, то тебе надо избегать динамического выделения памяти


psa247   (2006-11-22 11:43:00) [10]


> 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 09:23:00) [11]

> psa247  (22.11.2006 09:03:00)  [0]

// var InterfaceInfo : PIP_INTERFACE_INFO;
var InterfaceInfo : IP_INTERFACE_INFO;
..
// GetMem(InterfaceInfo, Len);
// FreeMem(InterfaceInfo);

И так далее


Наверх

Титульная страница Поиск, карта сайта Написать письмо