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

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

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

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

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

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

На Паскале вот такой код получился:
Код:
<..>
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  IpHlpApi,Winsock2,IpTypes,IpRtrMib;
<...>
 public
    { Public declarations }
    var
    counter: integer;
		upload1, download1, time1, time2, upspeedmax, downspeedmax:double;
<...>
//округление дробного числа до N знаков после запятой
function RoundEx(chislo: double; Precision: Integer): string;
var
  ChisloInStr: string;
  ChisloInCurr: currency;
begin
  ChisloInCurr := chislo;
  Str(ChisloInCurr: 20: Precision, ChisloInStr);
  ChisloInStr[Pos('.', ChisloInStr)] := ',';
  RoundEx := Trim(ChisloInStr);
end;

<...>
procedure TForm2.FormCreate(Sender: TObject);
begin
counter:=0;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
// Объявляем и инициализируем переменные
pMibIfRow: PMIB_IFROW;
ifTable: PMIB_IFTABLE;
dwSize: Cardinal;
dwRetVal: Cardinal;
str: array [0..255] of char;
i,j: integer;
down1, up1 : double;
begin
dwSize:=0;
dwRetVal:=0;
time1:=GetTickCount();

// Выделяем память для указателей

pMibIfRow:= PMIB_IFROW(GlobalAlloc(GPTR, SizeOf(MIB_IFROW)));
ifTable:= PMIB_IFTABLE(GlobalAlloc(GPTR, SizeOf(MIB_IFTABLE)));
dwSize:=SizeOf(MIB_IFTABLE);

// Перед вызовом GetIfEntry мы вызовем GetIfTable чтобы убедиться
// что тут есть что получать
// Сделаем инициализационный вызов GetIfTable, чтобы получить
// необходимый размер в dwSize
if  GetIfTable(ifTable, dwSize, False)= ERROR_INSUFFICIENT_BUFFER then
begin
GlobalFree(Cardinal(iftable));
ifTable:= PMIB_IFTABLE(GlobalAlloc(GPTR, dwSize));
end;

// Делаем второй вызов GetIfTable для получения актуальной информации
// которую мы хотим.

dwRetVal:=GetIfTable(ifTable, dwSize, False);
if dwRetVal=NO_ERROR then
begin
  if ifTable.dwNumEntries>0 then
  begin
    for j := 1 to ifTable.dwNumEntries do
    begin
    pMibIfRow.dwIndex:=j;
    dwRetVal:=GetIfEntry(pMibIfRow);
    if dwRetVal = NO_ERROR then
    begin
      if ((pMibIfRow.wszName<>nil) and (pMibIfRow.dwType=6)) then
      begin
      down1:=((pMibIfRow.dwInOctets)/1024.0/1024.0);
			up1:=((pMibIfRow.dwOutOctets)/1024.0/1024.0);
      Label1.Caption:=('Принято байт: '+IntToStr(pMibIfRow.dwInOctets)+' ('+String(RoundEx(down1,2))+' МБ)');
     Label2.Caption:=('Отправлено байт: '+IntToStr(pMibIfRow.dwOutOctets)+' ('+String(RoundEx(up1,2))+' МБ)');
      if (counter>0) then
		begin
		if (time1=time2) then time1:=time1+1;
                Label3.Caption:=('Скорость приема: '+RoundEx((pMibIfRow.dwInOctets-download1)/(time1-time2),2));
                Label4.Caption:=('Скорость отправки: '+RoundEx((pMibIfRow.dwOutOctets-upload1)/(time1-time2),2));
                if (downspeedmax<StrToFloat(RoundEx((pMibIfRow.dwInOctets-download1)/(time1-time2),2))) then
                  downspeedmax:=StrToFloat(RoundEx((pMibIfRow.dwInOctets-download1)/(time1-time2),2));
                Label5.Caption:=('Пиковая скорость загрузки: '+FloatToStr(downspeedmax));
                if (upspeedmax<StrToFloat(RoundEx((pMibIfRow.dwOutOctets-upload1)/(time1-time2),2))) then
                  upspeedmax:=StrToFloat(RoundEx((pMibIfRow.dwOutOctets-upload1)/(time1-time2),2));
                Label6.Caption:=('Пиковая скорость отправки: '+FloatToStr(upspeedmax));
							end;
				download1:=pMibIfRow.dwInOctets;
				upload1:=pMibIfRow.dwOutOctets;
				time2:=GetTickCount();
				inc (counter);

      end;
    end
  end;
  end
end;
GlobalFree(Cardinal(pMibIfRow));
GlobalFree(Cardinal(ifTable));
end;
Кривоват но работает. Основная проблема вылезла на Виста и более новых ОС, т.к. там GetIfEntry получают информацию о всех интерфейсах, какие только существуют в природе: MS LoopBack, Toredo, PPPOE и т.д. Хотя реально железных всего 2 сетевых адаптера.
calypso вне форума Ответить с цитированием
Старый 06.11.2015, 21:52   #32
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Проверяйте dwType и dwOperStatus - думаю так можно будет отсеять ненужные.
waleri вне форума Ответить с цитированием
Старый 10.11.2015, 23:05   #33
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Со структурой MIB_IF_ROW2 вообще какая-то петрушка получается. Вот такой код:
Код:
#pragma once
#include <Windows.h>
#include <IPHlpApi.h>
#include <Netioapi.h>
#include <msclr\marshal_cppstd.h>
#pragma comment(lib, "IPHlpApi.lib")
#pragma comment(lib, "Netioapi.lib")

typedef enum _NDIS_MEDIUM
{
    NdisMedium802_3,
    NdisMedium802_5,
    NdisMediumFddi,
    NdisMediumWan,
    NdisMediumLocalTalk,
    NdisMediumDix,              // defined for convenience, not a real medium
    NdisMediumArcnetRaw,
    NdisMediumArcnet878_2,
    NdisMediumAtm,
    NdisMediumWirelessWan,
    NdisMediumIrda,
    NdisMediumBpc,
    NdisMediumCoWan,
    NdisMedium1394,
    NdisMediumInfiniBand,
#if ((NTDDI_VERSION >= NTDDI_VISTA) || NDIS_SUPPORT_NDIS6)
    NdisMediumTunnel,
    NdisMediumNative802_11,
    NdisMediumLoopback,
#endif // (NTDDI_VERSION >= NTDDI_VISTA)

#if (NTDDI_VERSION >= NTDDI_WIN7)
    NdisMediumWiMAX,
    NdisMediumIP,
#endif

    NdisMediumMax               // Not a real medium, defined as an upper-bound
} NDIS_MEDIUM, *PNDIS_MEDIUM;


typedef enum _NDIS_PHYSICAL_MEDIUM
{
    NdisPhysicalMediumUnspecified,
    NdisPhysicalMediumWirelessLan,
    NdisPhysicalMediumCableModem,
    NdisPhysicalMediumPhoneLine,
    NdisPhysicalMediumPowerLine,
    NdisPhysicalMediumDSL,      // includes ADSL and UADSL (G.Lite)
    NdisPhysicalMediumFibreChannel,
    NdisPhysicalMedium1394,
    NdisPhysicalMediumWirelessWan,
    NdisPhysicalMediumNative802_11,
    NdisPhysicalMediumBluetooth,
    NdisPhysicalMediumInfiniband,
    NdisPhysicalMediumWiMax,
    NdisPhysicalMediumUWB,
    NdisPhysicalMedium802_3,
    NdisPhysicalMedium802_5,
    NdisPhysicalMediumIrda,
    NdisPhysicalMediumWiredWAN,
    NdisPhysicalMediumWiredCoWan,
    NdisPhysicalMediumOther,
    NdisPhysicalMediumMax       // Not a real physical type, defined as an upper-bound
} NDIS_PHYSICAL_MEDIUM, *PNDIS_PHYSICAL_MEDIUM;

typedef struct _MIB_IF_ROW2 {
    //
    // Key structure.  Sorted by preference.
    //
    NET_LUID InterfaceLuid;
    NET_IFINDEX InterfaceIndex; 

    //
    // Read-Only fields.
    //
    GUID InterfaceGuid;
    WCHAR Alias[IF_MAX_STRING_SIZE + 1]; 
    WCHAR Description[IF_MAX_STRING_SIZE + 1];
    ULONG PhysicalAddressLength;
    UCHAR PhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH];
    UCHAR PermanentPhysicalAddress[IF_MAX_PHYS_ADDRESS_LENGTH];    

    ULONG Mtu;
    IFTYPE Type;                // Interface Type.
    TUNNEL_TYPE TunnelType;     // Tunnel Type, if Type = IF_TUNNEL.
    NDIS_MEDIUM MediaType; 
    NDIS_PHYSICAL_MEDIUM PhysicalMediumType; 
    NET_IF_ACCESS_TYPE AccessType;
    NET_IF_DIRECTION_TYPE DirectionType;
    struct {
        BOOLEAN HardwareInterface : 1;
        BOOLEAN FilterInterface : 1;
        BOOLEAN ConnectorPresent : 1;
        BOOLEAN NotAuthenticated : 1;
        BOOLEAN NotMediaConnected : 1;
        BOOLEAN Paused : 1;
        BOOLEAN LowPower : 1;
        BOOLEAN EndPointInterface : 1;
    } InterfaceAndOperStatusFlags;
    
    IF_OPER_STATUS OperStatus;  
    NET_IF_ADMIN_STATUS AdminStatus;
    NET_IF_MEDIA_CONNECT_STATE MediaConnectState;
    NET_IF_NETWORK_GUID NetworkGuid;
    NET_IF_CONNECTION_TYPE ConnectionType; 

    //
    // Statistics.
    //
    ULONG64 TransmitLinkSpeed;
    ULONG64 ReceiveLinkSpeed;

    ULONG64 InOctets;
    ULONG64 InUcastPkts;
    ULONG64 InNUcastPkts;
    ULONG64 InDiscards;
    ULONG64 InErrors;
    ULONG64 InUnknownProtos;
    ULONG64 InUcastOctets;      
    ULONG64 InMulticastOctets;  
    ULONG64 InBroadcastOctets; 
    ULONG64 OutOctets;
    ULONG64 OutUcastPkts;
    ULONG64 OutNUcastPkts;
    ULONG64 OutDiscards;
    ULONG64 OutErrors;
    ULONG64 OutUcastOctets;     
    ULONG64 OutMulticastOctets; 
    ULONG64 OutBroadcastOctets;   
    ULONG64 OutQLen; 
} MIB_IF_ROW2, *PMIB_IF_ROW2;

typedef struct _MIB_IF_TABLE2 {
    ULONG NumEntries;
    MIB_IF_ROW2 Table[ANY_SIZE];
} MIB_IF_TABLE2, *PMIB_IF_TABLE2;

typedef enum _MIB_IF_TABLE_LEVEL {
    MibIfTableNormal,
    MibIfTableRaw
} MIB_IF_TABLE_LEVEL, *PMIB_IF_TABLE_LEVEL;

NETIOAPI_API GetIfTable2Ex( _In_ MIB_IF_TABLE_LEVEL Level,   _Outptr_ PMIB_IF_TABLE2 *Table   );
NETIOAPI_API GetIfEntry2(_Inout_ PMIB_IF_ROW2 Row);



#define MALLOC(x) HeapAlloc(GetProcessHeap(),0,(x))
#define FREE(x) HeapFree(GetProcessHeap(),0,(x))

<тут всякая лабуда про namespace>
calypso вне форума Ответить с цитированием
Старый 10.11.2015, 23:05   #34
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Код:
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
			 {				
				 DWORD dwSize=0;
				 DWORD dwRetVal=0;
				 int i,j;
				 MIB_IF_TABLE2 *pIfTable2;
				 MIB_IF_ROW2 *pIfRow2;
				 int oshibka;
				 pIfTable2=(MIB_IF_TABLE2*) MALLOC(sizeof(MIB_IF_TABLE2));
				 if (pIfTable2==NULL) MessageBox::Show("Ошибка при выделении памяти под 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)	 MessageBox::Show("Ошибка выделения памяти MIB_IF_TABLE2");
				 }
					 //второй вызов GetIfTable2Ex который должен завершиться без ошибок
					 if (GetIfTable2Ex(MibIfTableNormal,&pIfTable2)==NO_ERROR) 
						 {
							 MessageBox::Show("Успешно!");
							 if (pIfTable2->NumEntries>0)
							 {
								pIfRow2=(MIB_IF_ROW2*) MALLOC(sizeof(MIB_IF_ROW2));
								if (pIfRow2==NULL)
								{
									MessageBox::Show("Ошибка выделения памяти MIB_IF_ROW2");
									if (pIfRow2!=NULL)
									{
										FREE(pIfTable2);
										pIfTable2=NULL;
									}
								}
							 }
					   }
					 else 
						 {
							 oshibka=GetLastError();
							 MessageBox::Show("Ошибка при вызове функции GetIfTable2Ex: "+oshibka.ToString());
					     }
					 for (i=0;i<(int)pIfTable2->NumEntries;i++)
					 {
						 pIfRow2->InterfaceIndex=pIfTable2->Table[i].InterfaceIndex;
						 if ((dwRetVal=GetIfEntry2(pIfRow2))==NO_ERROR)
						 {
							 if ((pIfRow2->Alias!=NULL) && (pIfRow2->Type==IF_TYPE_ETHERNET_CSMACD))
						     {
							listBox1->Items->Add("Имя интерфейса: "+msclr::interop::marshal_as<String^>(pIfRow2->Alias));
							listBox1->Items->Add("Принято байт: "+(pIfRow2->InOctets).ToString()+" ("+(pIfRow2->InOctets/1024).ToString()+" КБ)");
							listBox1->Items->Add("Отправлено байт: "+(pIfRow2->OutOctets).ToString()+" ("+(pIfRow2->OutOctets/1024).ToString()+" КБ)");
							 }
						 }
					 }

			 }
	};
	}
Система Windows 8.1 x64, SDK Visual Studio 2012. Студия напрочь игнорирует файлы как Netioapi.h, так Netioapi.lib. Пришлось описание функций скопировать из Netioapi.h т.к. иначе пишет что MIB_IF_ROW2 неизвестный идентификатор и т.д.
Сейчас линкер ругается, он хочет чтобы библиотека Netioapi.lib была подключена.
На разных версиях Студии (2010, 2012) всё тоже самое. Не пойму в чем тут собака порылась
calypso вне форума Ответить с цитированием
Старый 11.11.2015, 09:06   #35
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Убрать netioapi.h
Вставить
#include <ws2ipdef.h>
#include <iphlpapi.h>
waleri вне форума Ответить с цитированием
Старый 11.11.2015, 13:44   #36
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Вообщем если оставить как у меня было, то выдает вот что:
Код:
error LNK2028: ссылка на неразрешенную лексему (0A0003EF) "unsigned long __stdcall GetIfTable2Ex(enum _MIB_IF_TABLE_LEVEL,struct _MIB_IF_TABLE2 * *)" (?GetIfTable2Ex@@$$FYGKW4_MIB_IF_TABLE_LEVEL@@PAPAU_MIB_IF_TABLE2@@@Z) в функции "private: void __clrcall GetNetworkSpeed2::Lizard::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Lizard@GetNetworkSpeed2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>Lizard.obj : error LNK2028: ссылка на неразрешенную лексему (0A000405) "unsigned long __stdcall GetIfEntry2(struct _MIB_IF_ROW2 *)" (?GetIfEntry2@@$$FYGKPAU_MIB_IF_ROW2@@@Z) в функции "private: void __clrcall GetNetworkSpeed2::Lizard::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Lizard@GetNetworkSpeed2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>Lizard.obj : error LNK2019: ссылка на неразрешенный внешний символ "unsigned long __stdcall GetIfTable2Ex(enum _MIB_IF_TABLE_LEVEL,struct _MIB_IF_TABLE2 * *)" (?GetIfTable2Ex@@$$FYGKW4_MIB_IF_TABLE_LEVEL@@PAPAU_MIB_IF_TABLE2@@@Z) в функции "private: void __clrcall GetNetworkSpeed2::Lizard::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Lizard@GetNetworkSpeed2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>Lizard.obj : error LNK2019: ссылка на неразрешенный внешний символ "unsigned long __stdcall GetIfEntry2(struct _MIB_IF_ROW2 *)" (?GetIfEntry2@@$$FYGKPAU_MIB_IF_ROW2@@@Z) в функции "private: void __clrcall GetNetworkSpeed2::Lizard::button1_Click(class System::Object ^,class System::EventArgs ^)" (?button1_Click@Lizard@GetNetworkSpeed2@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)
1>C:\Users\Dragon\Documents\Visual Studio 2012\Projects\GetIfTable2Ex\GetNetworkSpeed2\Debug\GetNetworkSpeed2.exe : fatal error LNK1120: неразрешенных внешних элементов: 4
Если оставить только
#include <ws2ipdef.h>
#include <iphlpapi.h>
то ругается:
Код:
1>C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2ipdef.h(102): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "iiAddress"
Строка SOCKET_ADDRESS iiAddress; // Interface address. в ws2ipdef.h
и ещё куча ошибок.

Если добавить
#include <ws2def.h>
#include <ws2ipdef.h>
то ругается что:
Код:
1>C:\Program Files (x86)\Windows Kits\8.0\Include\shared\ws2def.h(43): fatal error C1189: #error :  Do not include winsock.h and ws2def.h in the same module. Instead include only winsock2.h.
Если добавить #include <winsock2.h> то вообще сыпет ошибки.

Не пойму, может из-за того что проект CLR NET 4.5 ? Но с MIB_IFROW всё хорошо откомпилировалось.
calypso вне форума Ответить с цитированием
Старый 11.11.2015, 13:47   #37
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

По идее можно сделать по другому, через LoadLibrary "netioapi.dll", затем GetProcAddress(GetIfTable2Ex) и не заморачиваться с этими хидерами.
calypso вне форума Ответить с цитированием
Старый 13.11.2015, 21:03   #38
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Запилил тот же код на Embarcadero C++ XE8, всё отлично компилируется. Причем
#include <ws2ipdef.h>
#include <iphlpapi.h>
эквавалетно
#include <netioapi.h>

Только вот if ((dwRetVal=GetIfEntry2(pIfRow2))==N O_ERROR) выдает код возврата 2, что вроде означает ERROR_FILE_NOT_FOUND.

Я ещё не понял в чем разница между MIB_IF_ROW2 и MIB_IF_TABLE2, потому что GetIfTable2Ex(MibIfTableNormal,&pIf Table2) уже записывает нужные параметры в структуру pIfTable2. А pIfRow нужна чисто для выравнивания?

Последний раз редактировалось Аватар; 13.11.2015 в 21:10.
calypso вне форума Ответить с цитированием
Старый 15.11.2015, 21:55   #39
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Всё разобрался, вот код на Embarcadero C++ RAD Studio 10 Seattle (ну можете запилить его на старом Борланд Билдере 5, тоже должно работать )
Код:
#include <vcl.h>
#pragma hdrstop
#pragma comment(lib, "IPHlpApi.lib")

#include "GetIfEntry2.h"
#include <ws2ipdef.h>
#include <iphlpapi.h>

#define MALLOC(x) HeapAlloc(GetProcessHeap(),0,(x))
#define FREE(x) HeapFree(GetProcessHeap(),0,(x))
<...>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 DWORD dwSize=0;
DWORD dwRetVal=0;
int i,j;
MIB_IF_TABLE2 *pIfTable2;
MIB_IF_ROW2 *pIfRow2;
 int oshibka;
 pIfTable2=(MIB_IF_TABLE2*) MALLOC(sizeof(MIB_IF_TABLE2));
 if (pIfTable2==NULL) ShowMessage("Ошибка при выделении памяти под 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)	 ShowMessage("Ошибка выделения памяти MIB_IF_TABLE2");
	 }
 //второй вызов GetIfTable2Ex который должен завершиться без ошибок
 if (GetIfTable2Ex(MibIfTableNormal,&pIfTable2)==NO_ERROR)
	 {
	 ShowMessage("Успешно!");
	 if (pIfTable2->NumEntries>0)
	 {
	pIfRow2=(MIB_IF_ROW2*) MALLOC(sizeof(MIB_IF_ROW2));
	if (pIfRow2==NULL)
	{
	ShowMessage("Ошибка выделения памяти MIB_IF_ROW2");
	if (pIfRow2!=NULL)
	{
	FREE(pIfTable2);
	pIfTable2=NULL;
	}
	}
 }
  }
 else
	 {
	 oshibka=GetLastError();
 ShowMessage("Ошибка при вызове функции GetIfTable2Ex: "+String(oshibka));
	 }
 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))
    {
ListBox1->Items->Add("Имя интерфейса: "+String(pIfRow2->Alias));
ListBox1->Items->Add("Описание интерфейса: "+String(pIfRow2->Description));
ListBox1->Items->Add("Принято байт: "+String(pIfRow2->InOctets)+" ("+String(pIfRow2->InOctets/1024)+" КБ)");
							ListBox1->Items->Add("Отправлено байт: "+String(pIfRow2->OutOctets)+" ("+String(pIfRow2->OutOctets/1024)+" КБ)");
		 }
	 }
 }
 }


У кого GetIfEntry2 выдает ошибку 2 или 87 по другим исходникам, причина кроется здесь:
pIfRow2->InterfaceLuid = pIfTable2->Table[i].InterfaceLuid;

Последний раз редактировалось calypso; 15.11.2015 в 21:57.
calypso вне форума Ответить с цитированием
Старый 17.11.2015, 21:04   #40
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Visual Studio пока не могу победить. Уже скачал и Windows DDK для Windows 7, прописал библиотеки:
Код:
#pragma comment(lib, "dnslib.lib")
#pragma comment(lib, "netio.lib")
#pragma comment(lib, "IPHlpApi.lib")
и всё равно зараза выдает ошибку "error LNK2028: ссылка на неразрешенную лексему"
Видимо здесь собака порылась:
Код:
NETIOAPI_API GetIfTable2Ex( _In_ MIB_IF_TABLE_LEVEL Level,   _Outptr_ PMIB_IF_TABLE2 *Table   );
NETIOAPI_API GetIfEntry2(_Inout_ PMIB_IF_ROW2 Row);
Нельзя их просто так взять и скопировать из файла netioapi.h , а подключить через хидер не получается из-за CLI и CLR.
calypso вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать скорость передачи данных (при копировании файлов) по сети calypso Работа с сетью в Delphi 0 02.12.2012 19:56
Сканирование документов по сети / Scan over Ethernet mixael Работа с сетью в Delphi 0 08.10.2010 11:03
Как определить текущую строку StringGrid Veiron Общие вопросы Delphi 2 24.09.2009 03:03
Определить текущую ячейку на листе НикНик Microsoft Office Excel 5 18.08.2008 09:40
Как определить IP-адресс компьютера в локальной сети? SalasAndriy C/C++ Сетевое программирование 2 29.11.2007 02:09