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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2016, 01:19   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Не работает функция GetIfEntry2

Код:
NET_LUID = record
   case Integer of
     0: (Value: DWORD); //UInt64 --> DWORD
     1: (Reserved: DWORD; NetLuidIndex: DWORD; IfType: DWORD);
  end;

NET_IFINDEX = ULONG;

PMIB_IF_ROW2 = ^MIB_IF_ROW2;
 _MIB_IF_ROW2 = packed record
   InterfaceLuid: NET_LUID;
   InterfaceIndex: NET_IFINDEX;
   InterfaceGuid: TGUID;
   Alias: array[0..IF_MAX_STRING_SIZE] of WideChar;
   Description: array[0..IF_MAX_STRING_SIZE] of WideChar;
   PhysicalAddressLength: Cardinal;
   PhysicalAddress: array[0..IF_MAX_PHYS_ADDRESS_LENGTH - 1] of Byte;
   PermanentPhysicalAddress: array[0..IF_MAX_PHYS_ADDRESS_LENGTH - 1]of Byte;
   Mtu: Cardinal;//ULONG;
   aType: Cardinal;
   TunnelType: Cardinal;
   MediaType: Cardinal;
   PhysicalMediumType: Cardinal;
   AccessType: Cardinal;
   DirectionType: Cardinal;
   InterfaceAndOperStatusFlags: Cardinal;// 8 значений, поразрядное ИЛИ TInterfaceAndOperStatusFlags;
   OperStatus: Cardinal;
   AdminStatus: Cardinal;
   MediaConnectState: Cardinal;
   NetworkGuid: TGUID;
   ConnectionType: Cardinal;
   TransmitLinkSpeed: UInt64;
   ReceiveLinkSpeed: UInt64;
   InOctets: UInt64;
   InUcastPkts: UInt64;
   InNUcastPkts: UInt64;
   InDiscards: UInt64;
   InErrors: UInt64;
   InUnknownProtos: UInt64;
   InUcastOctets: UInt64;
   InMulticastOctets: UInt64;
   InBroadcastOctets: UInt64;
   OutOctets: UInt64;
   OutUcastPkts: UInt64;
   OutNUcastPkts: UInt64;
   OutDiscards: UInt64;
   OutErrors: UInt64;
   OutUcastOctets: UInt64;
   OutMulticastOctets: UInt64;
   OutBroadcastOctets: UInt64;
   OutQLen: UInt64;
 end;
 MIB_IF_ROW2 = _MIB_IF_ROW2;
 TMibIfRow2 = MIB_IF_ROW2;
 PMibIfRow2 = PMIB_IF_ROW2;

 TMibIfArray2 = array [0..ANY_SIZE - 1] of TMibIfRow2;
 PMibIfArray2 = ^TMibIfArray2;

 PMIB_IF_TABLE2 = ^MIB_IF_TABLE2;
 _MIB_IF_TABLE2 = packed record
   NumEntries: Cardinal;
   Table: array[0..ANY_SIZE - 1] of _MIB_IF_ROW2;
 end;
 MIB_IF_TABLE2 = _MIB_IF_TABLE2;
 TMibIfTable2 = MIB_IF_TABLE2;
 PMibIfTable2 = PMIB_IF_TABLE2;
<...>
GetIfEntry2: function(var pIfRow2 : PMibIfRow2): DWORD; stdcall;
FLibHandle := LoadLibrary('IpHlpAPI.DLL');
@GetIfTable2 := GetProcAddress(FLibHandle, 'GetIfTable2');
@GetIfEntry2 := GetProcAddress(FLibHandle, 'GetIfEntry2');
// Выделяем память для указателей
pIfTable2:=PMIB_IF_TABLE2 (GlobalAlloc(GPTR, SizeOf(MIB_IF_TABLE2)));
 if (pIfTable2=nil) then Memo1.Lines.Add('Ошибка при выделении памяти под GetIfTable2!');
...
//инициализация GetIfTable2 чтобы получить размер dwSize
	 dwSize:=sizeof(MIB_IF_TABLE2);
   resultat:=GetIfTable2(pIfTable2);
   if (resultat=ERROR_NOT_ENOUGH_MEMORY) then
   begin
      GlobalFree(Cardinal(pIfTable2));
      pIfTable2:=PMIB_IF_TABLE2 (GlobalAlloc(GPTR, dwSize));
       if (pIfTable2=nil)	then Memo1.Lines.Add('Ошибка выделения памяти MIB_IF_TABLE2');
     end;
  //второй вызов GetIfTable2Ex который должен завершиться без ошибок
           resultat:=GetIfTable2(pIfTable2);
 if (resultat=NO_ERROR) then
 begin
	 if (pIfTable2.NumEntries>0) then
               begin
	PIfRow2:=PMIB_IF_ROW2 (GlobalAlloc(GPTR,sizeof(MIB_IF_ROW2)));
if (PIfRow2=nil) then
                  begin
	  Memo1.Lines.Add('Ошибка выделения памяти MIB_IF_ROW2');
	  if (pIfRow2<>nil) then
                    begin
		GlobalFree(Cardinal(pIfTable2));
		pIfTable2:=nil;
                    end
                 end
               end
             end
	 else
 begin
 oshibka:=GetLastError();
 Memo1.Lines.Add('Ошибка при вызове функции GetIfTable2Ex: '+IntToStr(oshibka));
             end;
              //перебираем все записи в таблице
            if pIfTable2.NumEntries>0 then
            begin
              for I:= 0 to pIfTable2.NumEntries do

              GetMem(pIfRow2, SizeOf(MIB_IF_ROW2));
                   pIfRow2.InterfaceIndex:=pIfTable2.Table[I].InterfaceIndex;
                  pIfRow2.InterfaceLuid:= pIfTable2.Table[I].InterfaceLuid;
dwRetVal:=GetIfEntry2(pIfRow2);
         if (dwRetVal = NO_ERROR) then
                    begin
                      if ((pIfRow2.Alias<>nil) and (pIfRow2.aType=IF_TYPE_ETHERNET_CSMACD) and (pIfRow2.PhysicalMediumType = NdisPhysicalMedium802_3) and (pIfRow2.OperStatus=IfOperStatusUp) and (pIfRow2.InterfaceAndOperStatusFlags=1)) then
                       begin
                         Memo1.Lines.Add(pIfRow2.Alias);
                         Memo1.Lines.Add(pIfRow2.Description);
                         Memo1.Lines.Add(RoundEx(pIfRow2.InOctets/1024/1024,2));
                         Memo1.Lines.Add(RoundEx(pIfRow2.OutOctets/1024/1024,2));
                       end;
                    end
else Memo1.Lines.Add('Ошибка при получении информации GetIfEntry2');
                 end;
               end;
          end;
Структура pIfTable2 заполняется и работает, а структура pIfRow2 заполнена нулями при любом значении InterfaceIndex и функция GetIfRow2 выдает ошибку 2: FILE_NOT_FOUND
Не пойму в чем дело, аналогичный код на C++ работает исправно, проверил как на Visual Studio 2012 , так и на Embarcadero C++
calypso вне форума Ответить с цитированием
Старый 15.04.2016, 01:22   #2
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Вот к примеру рабочий код на С++
Код:
	 MIB_IF_TABLE2 *pIfTable2;
		 MIB_IF_ROW2 *pIfRow2;
 pIfTable2=(MIB_IF_TABLE2*) MALLOC(sizeof(MIB_IF_TABLE2));
 if (pIfTable2==NULL) listBox2->Items->Add("Ошибка при выделении памяти под GetIfTable2!");
 //инициализация GetIfTable2Ex чтобы получить размер dwSize
	 dwSize=sizeof(MIB_IF_TABLE2);
  if (GetIfTable2Ex(MibIfTableNormal,&pIfTable2)==ERROR_NOT_ENOUGH_MEMORY)
					 {
						 FREE(pIfTable2);
						 pIfTable2=(MIB_IF_TABLE2*) MALLOC(dwSize);
						 if (pIfTable2==NULL)	 listBox2->Items->Add("Ошибка выделения памяти MIB_IF_TABLE2");
				 }
				  FREE(pIfTable2);
		 //второй вызов GetIfTable2Ex который должен завершиться без ошибок
	 if (GetIfTable2Ex(MibIfTableNormal,&pIfTable2)==NO_ERROR) 
						 {
							 if (pIfTable2->NumEntries>0)
							 {
				pIfRow2=(MIB_IF_ROW2*) MALLOC(sizeof(MIB_IF_ROW2));
								if (pIfRow2==NULL)
								{
			listBox2->Items->Add("Ошибка выделения памяти MIB_IF_ROW2");
									if (pIfRow2!=NULL)
									{
										FREE(pIfTable2);
										pIfTable2=NULL;
									}
								}
							 }
						  }
					 else 
						 {
							 oshibka=GetLastError();
 listBox2->Items->Add("Ошибка при вызове функции GetIfTable2Ex: "+oshibka.ToString());
					     }
					 //перебираем все записи в таблице
		 for (i=0;i<(int)pIfTable2->NumEntries;i++)
					 {
						 pIfRow2->InterfaceIndex=pIfTable2->Table[i].InterfaceIndex;
 SecureZeroMemory((PVOID)pIfRow2, sizeof(MIB_IF_ROW2));
			pIfRow2->InterfaceLuid = pIfTable2->Table[i].InterfaceLuid;
			if ((dwRetVal = GetIfEntry2(pIfRow2)) == NO_ERROR)
			{
if ((pIfRow2->Alias != NULL) && (pIfRow2->Type == IF_TYPE_ETHERNET_CSMACD) && (pIfRow2->PhysicalMediumType == NdisPhysicalMedium802_3) && (pIfRow2->OperStatus == IfOperStatusUp) && (pIfRow2->InterfaceAndOperStatusFlags.HardwareInterface == 1))
<..выводим нужную информацию..>
calypso вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция awashwinter Общие вопросы C/C++ 0 13.03.2016 13:57
Не работает функция mazanakee Visual C++ 0 22.02.2015 19:20
Sendmail работает, функция mail() работает, но есть проблема. PavelNAndreev PHP 8 27.01.2014 12:45
Не работает функция max400 PHP 13 29.07.2011 10:28
Не работает функция kakawkin Общие вопросы Delphi 3 28.05.2011 15:09