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

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

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

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

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

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

Так было в примере. Я почитал MSDN, там пишут что использование многопоточного режима более предпочтительно. Код выполняется быстрее и меньше глюков.
Если поставить COINIT_APARTMENTTHREADED, то hRes=1
Хотя изучить COM модель тоже не помешает, вроде пишут что все крутые чуваки должны уметь программировать под COM, OLE и ActiveX
calypso вне форума Ответить с цитированием
Старый 24.09.2015, 00:01   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

hRes = 1 это не ошибка, это S_FALSE - The COM library is already initialized on this thread.
waleri вне форума Ответить с цитированием
Старый 24.09.2015, 00:18   #13
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Я знаю, ошибка когда COINIT_MULTITHREADED. Номер не помню, описание примерно так звучит "невозможно изменить свойства потока, который уже запущен".
Для начала попробую простой способ, а потом уже будем лезть в эти дебри
calypso вне форума Ответить с цитированием
Старый 24.09.2015, 09:40   #14
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

COM уже проинициализирован в другом режиме.
Либо запускайте свой поток, либо просто используйте single threaded режим, многозадачность здесь особо не надо.
waleri вне форума Ответить с цитированием
Старый 20.10.2015, 19:15   #15
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ковырял сегодня АИДА64, пытался понять как устроено там всё это хозяйство. Для замера скорости дергает GetTickCount в цикле, это я накидал сегодня простенькую демку (таймер и по каждому событию OnTimer вызов GetTickCount). Таким образом получаем время. А как получить количество трафика не нашел.
Причем показывается именно значение от подключения сетевой карты,а не от запуска АИДА64. То есть операционка сама хранит где то количество байт переданных и отправленных. При этом в свойства сетевого подключения отображаются пакеты (для Windows XP).
Опять же dwInOctets это будут байты или пакеты? Я так понял что пакеты
И как пакеты преобразовать в байты?
calypso вне форума Ответить с цитированием
Старый 20.10.2015, 19:58   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Это байты...
waleri вне форума Ответить с цитированием
Старый 20.10.2015, 20:50   #17
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

То есть алгоритм будет такой:
1. замеряем время1
2. дергаем GetIfEntry2, получаем байты1
3. через n миллисекунд замеряем время2
4. дергаем опять GetIfEntry2, получаем байты2
5. скорость=(байты2-байты1)/(GetTickCount2-GetTickCount1)

И всё это засунуть в TTimer на форму с заданным интервалов, например 10 миллисекунд.

Не работает GetIfEntry:
Код:
procedure  GetIfEntryTest;
var
// Объявляем и инициализируем переменные
pMibIfRow: PMIB_IFROW;
ifTable: PMIB_IFTABLE;
dwSize: Cardinal;
dwRetVal: Cardinal;
str: array [0..255] of char;
i,j: integer;
begin
dwSize:=0;
dwRetVal:=0;

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

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(nil, 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
      ShowMessage(IntToStr(pMibIfRow.dwIndex));
      for i:=0 to 255 do
      str[i]:=chr(pMibIfRow.bDescr[i]);
      ShowMessage(str);
    end
    else begin
      ShowMessage('Ошибка GetIfEntry failed');
      //Тут вы можете использовать FormatMessage чтобы
      //понять почему вылезла ошибка
    end;
  end;
  end
  else begin
  ShowMessage('Ошибка GetIfTable');
  end;
end;
GlobalFree(Cardinal(pMibIfRow));
GlobalFree(Cardinal(ifTable));
end;
Второй вызов dwRetVal:=GetIfTable(ifTable, dwSize, False); выдает ошибку 122 "недостаточный размер буфера".

Последний раз редактировалось Stilet; 31.10.2015 в 07:44.
calypso вне форума Ответить с цитированием
Старый 26.10.2015, 11:04   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Ну так сравните dwSize после первого и второго вызовов...

в GetIfTable надо передавать *указатель* на dwSize а здесь я ничего подобного не вижу, правда я в паскале не разбираюсь.
waleri вне форума Ответить с цитированием
Старый 26.10.2015, 13:43   #19
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

В разных исходниках по разному, есть где @dwSize, но компилятор ругается что типы параметров в описании функции и вызове должны совпадать.
Types of actual and formal var parameters must be identical

Указатели в Паскале такие же, как в С++, отличается синтаксис:
*pointer на паскале будет pointer^
&var на паскале будет @var

Последний раз редактировалось Stilet; 31.10.2015 в 07:44.
calypso вне форума Ответить с цитированием
Старый 26.10.2015, 14:33   #20
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Ну так сравните тип переменной dwSize и с типом, который ожидает GetIfTable()
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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