Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.058 c
2-1179322729
AlexeiBerkov
2007-05-16 17:38
2007.06.10
проверка соединения для TADOConection


15-1178992711
Ёжик
2007-05-12 21:58
2007.06.10
Вышел - таки KDE4


2-1179387067
FRAGMIR
2007-05-17 11:31
2007.06.10
ADOconnection


2-1179393412
Kolan
2007-05-17 13:16
2007.06.10
Никогда не делал отчёт, как это делать.


6-1164471298
NeyroSpace
2006-11-25 19:14
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский