Главная страница
    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.47 MB
Время: 0.041 c
3-1174465590
nick_van_rijn
2007-03-21 11:26
2007.06.10
тормоза при исполнении множественных запросов


2-1179834805
IgorMish
2007-05-22 15:53
2007.06.10
Как записать картинку в Paradox


15-1179317312
ArtemESC
2007-05-16 16:08
2007.06.10
На каком языке мыслите вы?


2-1179413597
Dr.M@$
2007-05-17 18:53
2007.06.10
Проблема работы ASM в XP


15-1179297538
IMHO
2007-05-16 10:38
2007.06.10
Сегодня - финал Кубка УЕФА!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский