Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2009, 18:51   #1
Zigmuntfreyd
 
Регистрация: 12.10.2009
Сообщений: 7
По умолчанию iphlpapi

Пишу сетевую прогу на Делфи7. столкнулся с бедой. использую iphlpapi.dll
Беру информацию о сетевых интерфейсах через Get_AdaptersInfo
Все отлично работает. Но на некоторых компах возвращается ошибка "указано слишком длинное имя файла" судя по всему возвращается из-за виртуальных сетевых типа WMware (а может и не и за них). так как при их отключение. процедура выполняется без ошибок
Код:
function GetAdaptersInfo( pAdapterInfo: PTIP_ADAPTER_INFO;
  pOutBufLen: PULONG ): DWORD;
stdcall; external 'iphlpapi.dll';
Код:
procedure Get_AdaptersInfo(List: TStrings);
var
  Error,
  BufLen      : DWORD;
  P             : Pointer;
  AdapterInfo   : PTIP_ADAPTER_INFO;
  ADName,
  Descr,
  LocalIP,
  GatewayIP,
  DHCPIP: string;
begin
  if not Assigned( List ) then EXIT;
  List.Clear;
  BufLen := SizeOf( AdapterInfo^ );
  New( AdapterInfo );
  Error := GetAdaptersInfo( AdapterInfo, @BufLen );
  P := AdapterInfo;
  if Error = NO_ERROR then
  begin
    while P <> nil do
      with TIP_ADAPTER_INFO(P^) do
      begin

	      SetLength( ADNAme, SizeOf( AdapterName ) );
        ADName := Trim( string( AdapterName ) );

        SetLength( Descr, SizeOf( Description ) );
        Descr := Trim( string( Description ) );
        //
        if IPAddressList.IpAddress[1] <> #0 then
          LocalIP := IPAddressList.IpAddress
        else
          LocalIP := NULL_IP;
        //
        if GateWayList.IPAddress[1] <> #0 then
          GateWayIP := GatewayList.IPAddress
        else
          GateWayIP := NULL_IP;
        //
        if DHCPServer.IPAddress[1] <> #0 then
          DHCPIP := DHCPServer.IPAddress
        else
          DHCPIP := NULL_IP;

	      ADName1:=ADName;
        Descr1:=Descr;
        LocalIP1:=LocalIP;
        GatewayIP1:=GatewayIP;
        DHCPIP1:=DHCPIP;
        macadress1:=MacAddr2Str( TMacAddress( Address ), AddressLength );
        dhcpen1:=DHCPEnabled;

        List.Add( LocalIP );
        List.Add( GatewayIP );
        List.Add( GetConnectionName(ADName));
        List.Add( MacAddr2Str( TMacAddress( Address ), AddressLength ) );
        List.Add( inttostr(DHCPEnabled) );
        List.Add( DHCPIP );
        List.Add( Descr );
        List.Add( ADName );
        List.Add( '-------------------------------' );
        P := Next;  //  TIP_ADAPTER_INFO(P^).Next  points to next entry
      end // with
    end // while
  else
    List.Add( SysErrorMessage( Error ) );
  Dispose( AdapterInfo );
end;
через виндовый ipconfig /all их не видно, а он вроде как тоже юзает iphlpapi.dll
может их както не брать в расчет. и что именно у них длинное?

Последний раз редактировалось Zigmuntfreyd; 03.11.2009 в 20:55.
Zigmuntfreyd вне форума Ответить с цитированием
Старый 04.11.2009, 16:51   #2
Zigmuntfreyd
 
Регистрация: 12.10.2009
Сообщений: 7
По умолчанию

Всетаки дело не в виртуальных сетевых. с одним или двумя сетевыми устройствами все ок, но когда появляется третие, то все: "указано слишком длинное имя файла"

может какойто буфер расширить или освобождать при повторном чтении?
Код:
const
  ANY_SIZE      = 1;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH = 8; // arb.
  DEFAULT_MINIMUM_ENTITIES = 32; // arb.
  MAX_HOSTNAME_LEN = 128; // arb.
  MAX_DOMAIN_NAME_LEN = 128; // arb.
  MAX_SCOPE_ID_LEN = 256; // arb.
Zigmuntfreyd вне форума Ответить с цитированием
Старый 04.11.2009, 17:39   #3
Zigmuntfreyd
 
Регистрация: 12.10.2009
Сообщений: 7
По умолчанию

Все разобрался. напишу тут, а то малоли кому понадобится. буфер не правельно брался:
измененный участок кода:
был
Код:
  BufLen := SizeOf( AdapterInfo^ );
  New( AdapterInfo );
  Error := GetAdaptersInfo( AdapterInfo, @BufLen );
  P := AdapterInfo;
  if Error = NO_ERROR then

.......

  List.Add( SysErrorMessage( Error ) );
  Dispose( AdapterInfo );
стал
Код:
if GetAdaptersInfo(nil, @BufLen) = ERROR_BUFFER_OVERFLOW then
  begin
    GetMem(AdapterInfo, BufLen);
    try
    P := AdapterInfo;
  if GetAdaptersInfo(AdapterInfo, @BufLen) = ERROR_SUCCESS then

.........

  finally
    FreeMem(AdapterInfo);
    end;
Zigmuntfreyd вне форума Ответить с цитированием
Старый 18.08.2016, 13:21   #4
6667
Новичок
Джуниор
 
Регистрация: 17.10.2010
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Zigmuntfreyd Посмотреть сообщение
Все разобрался. напишу тут, а то малоли кому понадобится. буфер не правельно брался:
измененный участок кода:
был
Код:
  BufLen := SizeOf( AdapterInfo^ );
  New( AdapterInfo );
  Error := GetAdaptersInfo( AdapterInfo, @BufLen );
  P := AdapterInfo;
  if Error = NO_ERROR then

.......

  List.Add( SysErrorMessage( Error ) );
  Dispose( AdapterInfo );
стал
Код:
if GetAdaptersInfo(nil, @BufLen) = ERROR_BUFFER_OVERFLOW then
  begin
    GetMem(AdapterInfo, BufLen);
    try
    P := AdapterInfo;
  if GetAdaptersInfo(AdapterInfo, @BufLen) = ERROR_SUCCESS then

.........

  finally
    FreeMem(AdapterInfo);
    end;
Если можешь, выложи исходник, а то не получается все склеить
6667 вне форума Ответить с цитированием
Старый 18.08.2016, 14:03   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от 6667 Посмотреть сообщение
Если можешь, выложи исходник, а то не получается все склеить
То, что это было 7 лет назад, не смущает?


Zigmuntfreyd последний раз на форуме был в марте 2012 года...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фильтрация трафика [IpHlpApi] Denager Работа с сетью в Delphi 1 21.06.2009 01:01