Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.025 c
15-1178981335
ArtemESC
2007-05-12 18:48
2007.06.10
Benny Hill


2-1179526975
Heart_Beat
2007-05-19 02:22
2007.06.10
HELP!


5-1155552174
DevilDevil
2006-08-14 14:42
2007.06.10
published свойство - класс


15-1178537817
Kolan
2007-05-07 15:36
2007.06.10
А мастер я таки добил :)


2-1179783302
lestat13
2007-05-22 01:35
2007.06.10
Как загрузить в Memo код веб страницы??