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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2011, 23:28   #1
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос Не могу разобраться с GetAdaptersAddresses

Добрый. Написал тестовую программку, которая узнает основную инфу по установленным сетевым адаптерам в ОС.

Проблема: при выходе из программы сыпятся ошибки Access Violation. Хотя функция отрабатывает при запуске программы... Архив прилепил, укажите плиз на мою ошибку и реверс-беком исправленный код плиз. Заранее спасибо!

З.Ы. Наверное в раздел по WinApi никто не ходит, хотя там еще одна моя тема довольно актуальна. Тоже очень прошу помощи и по ней.

http://programmersforum.ru/showthread.php?p=896559


З.З.Ы. И да, все что нарыл в инете, прикладываю:
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
http://msdn.microsoft.com/en-us/libr...(PROT.10).aspx
Вложения
Тип файла: zip NET_INFO.ZIP (86.0 Кб, 32 просмотров)
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 19.10.2011 в 23:30.
3D Hunter вне форума Ответить с цитированием
Старый 20.10.2011, 00:06   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

связано что-то с уничтожением обьектов..
Код:
allocated memory  : 9,49 MB
executable        : NET_INFO.exe
exec. date/time   : 2011-10-19 23:03
compiled with     : Delphi XE
madExcept version : 3.0n
callstack crc     : $0de2a66a, $3b500815, $3b500815
count             : 2
exception number  : 1
exception class   : EAccessViolation
exception message : Access violation at address 004053E0 in module 'NET_INFO.exe'. Read of address 044E0437.

main thread ($a90):
004053e0 +08 NET_INFO.exe System         TObject.Free
004dcd3a +26 NET_INFO.exe ComCtrls       TCustomListView.Destroy
0051cc66 +ae NET_INFO.exe Controls       TWinControl.Destroy
004f00cc +38 NET_INFO.exe Forms          TScrollingWinControl.Destroy
004f0ed9 +f9 NET_INFO.exe Forms          TCustomForm.Destroy
004a540f +57 NET_INFO.exe Classes        TComponent.DestroyComponents
004eeed1 +35 NET_INFO.exe Forms          DoneApplication
0047787e +26 NET_INFO.exe SysUtils       DoExitProc
00406c61 +65 NET_INFO.exe System         @Halt0
00531e42 +4e NET_INFO.exe NET_INFO 17 +5 initialization

thread $774:
7c90df48 +0a ntdll.dll              NtWaitForMultipleObjects
004653a5 +0d NET_INFO.exe madExcept CallThreadProcSafe
0046540f +37 NET_INFO.exe madExcept ThreadExceptFrame
>> created by main thread ($a90) at:
77de8c8c +00 ADVAPI32.dll

active control:
TListView 	"lv_net" 	[, Destroying, FreeNotification]

cpu registers:
eax = 00b35d58
ebx = 00bd1901
ecx = 044e043b
edx = 00bd1901
esi = 00b28660
edi = 00b28660
eip = 004053e0
esp = 0012ff34
ebp = 0012ff78

stack dump:
0012ff34  3f cd 4d 00 f0 cf b3 00 - 01 00 00 00 69 cc 51 00  ?.M.........i.Q.
0012ff44  00 28 b8 00 f0 cf b3 00 - f0 cf b3 00 00 00 00 00  .(..............
0012ff54  d1 00 4f 00 b0 e7 b5 00 - b0 22 bd 00 de 0e 4f 00  ..O......"....O.
0012ff64  b0 ff 12 00 e8 64 40 00 - 78 ff 12 00 f0 cf b3 01  .....d@.x.......
0012ff74  f0 cf b3 00 c0 ff 12 00 - 12 54 4a 00 4c 80 53 00  .........TJ.L.S.
0012ff84  e4 aa 53 00 9c ee 4e 00 - d6 ee 4e 00 80 78 47 00  ..S...N...N..xG.
0012ff94  58 78 47 00 63 6c 40 00 - c0 ff 12 00 01 00 00 80  XxG.cl@.........
0012ffa4  84 da 6a 03 00 e0 fd 7f - 47 1e 53 00 e0 ff 12 00  ..j.....G.S.....
0012ffb4  b8 67 40 00 c0 ff 12 00 - 09 00 00 00 f0 ff 12 00  .g@.............
0012ffc4  77 70 81 7c 01 00 00 80 - 84 da 6a 03 00 e0 fd 7f  wp.|......j.....
0012ffd4  fa 12 55 80 c8 ff 12 00 - 70 97 ee 87 ff ff ff ff  ..U.....p.......
0012ffe4  a8 9a 83 7c 80 70 81 7c - 00 00 00 00 00 00 00 00  ...|.p.|........
0012fff4  00 00 00 00 f4 1d 53 00 - 00 00 00 00              ......S.....

disassembling:
00531df4    public NET_INFO.initialization:  ; function entry point
00531df4 12   push    ebp
00531df5      mov     ebp, esp
00531df7      add     esp, -$10
00531dfa      mov     eax, $52b4c4
00531dff      call    -$126cd0 ($40b134)     ; SysInit.@InitExe
00531e04 13   mov     eax, [$537a08]
00531e09      mov     eax, [eax]
00531e0b      call    -$36c58 ($4fb1b8)      ; Forms.TApplication.Initialize
00531e10 14   mov     eax, [$537a08]
00531e15      mov     eax, [eax]
00531e17      mov     dl, 1
00531e19      call    -$34f72 ($4fceac)      ; Forms.TApplication.SetMainFormOnTaskBar
00531e1e 15   mov     ecx, [$537770]
00531e24      mov     eax, [$537a08]
00531e29      mov     eax, [eax]
00531e2b      mov     edx, [$52ab98]
00531e31      call    -$36c66 ($4fb1d0)      ; Forms.TApplication.CreateForm
00531e36 16   mov     eax, [$537a08]
00531e3b      mov     eax, [eax]
00531e3d      call    -$36b22 ($4fb320)      ; Forms.TApplication.Run
00531e42 17 > call    -$12b24b ($406bfc)     ; System.@Halt0

ты что-то не отпускаешь.
А именно OnShow формы и OnData у ListView. Следовательно при каждом OnShow(актавация формы) сработывает OnData. А т.к. я уже послал WM_CLOSE окну, все его обьекты уже уничтожены(визуальные), то код заканчивает работу, но данные нужно сбросить куда-нибудь. Но этого "чего-то" уже нет.

Последний раз редактировалось Человек_Борща; 20.10.2011 в 00:11.
Человек_Борща вне форума Ответить с цитированием
Старый 20.10.2011, 00:15   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Вы оказались неправы
Решение оказалось связано с заменой New на GetMem размером bf.
Код:
Код:
function GetAdaInfo2(out AInfoStr:AnsiString; const AOnlyMac:Boolean):Boolean;
const
  cntAdaCount=2;
  cntAdaTypesInt:array[0..cntAdaCount] of Cardinal=($6,$47,$90);
  cntAdaTypesDef:array[0..cntAdaCount] of AnsiString=
                 ('Ethernet Network Adapter',
                  'Wireless Network Adapter',
                  'FireWire Network Adapter');
var
  i:Integer;
  bf:Cardinal;
  LqFind:Boolean;
  LsMac:AnsiString;
  LpAdapterAddresses:PIP_ADAPTER_ADDRESSES;
begin
  Result:=True;
  AInfoStr:='';
  try
    bf:=0;
    if GetAdaptersAddresses(0,0,nil,nil,@bf)<>ERROR_BUFFER_OVERFLOW then Abort;
    try
//      New(LpAdapterAddresses);
      GetMem(LpAdapterAddresses,bf);
      if GetAdaptersAddresses(0,0,nil,LpAdapterAddresses,@bf)<>ERROR_SUCCESS then Abort;
      while LpAdapterAddresses<>nil do
      begin
        try
          //определяем тип адаптера
          LqFind:=False;
          for i:=0 to cntAdaCount do
          if LpAdapterAddresses^.IfType=cntAdaTypesInt[i] then
          begin
            LqFind:=True;
            Break;
          end;
          if not LqFind then Continue;

          //собираем информацию об устройстве
          if not AOnlyMac then
            AInfoStr:=Format('%s%s (%s)'#13#10'%s'#13#10,
                             [AInfoStr,LpAdapterAddresses^.FriendlyName,
                              LpAdapterAddresses^.Description,cntAdaTypesDef[i]]);
          LsMac:='';
          if LpAdapterAddresses^.PhysicalAddressLength=0 then Continue;
          for i:=0 to LpAdapterAddresses^.PhysicalAddressLength-1 do
            LsMac:=LsMac+IntToHex(LpAdapterAddresses^.PhysicalAddress[i],2)+'-';
          SetLength(LsMac,Length(LsMac)-1);
          AInfoStr:=Format('%s%s'#13#10#13#10,[AInfoStr,LsMac]);
        finally
          LpAdapterAddresses:=LpAdapterAddresses^.Next;
        end;
      end;
    finally
      FreeMem(LpAdapterAddresses,bf);
//      Dispose(LpAdapterAddresses);
    end;
  except
    Result:=False;
    AInfoStr:='';
  end;
end;
Посмотрев еще раз пример из MSDN, заметил, что после 1го вызова функции нужно выделить память не в 4 байта указатель на структуру, а именно с размером в возвращенное значение bf. Попробуйте, у меня работает.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 20.10.2011, 00:22   #4
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
Вопрос

В общем, прикладываю исходники с двумя вариантами: использование уже устаревшей по мнению Микрософта GetAdaptersInfo и современной GetAdaptersAddresses.
Кому это нужно и своевременно, пользуйтесь на здоровье
Вложения
Тип файла: zip NET_INFO.ZIP (86.2 Кб, 160 просмотров)
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 29.03.2012, 15:32   #5
RainMEN2009
 
Регистрация: 25.03.2012
Сообщений: 5
Злость

Привет всем!
Посмотрел и понял что это единственный вариант который работает по windows 7, выдавая реальные названия сетевых подключений, а не {89898908988086274-83939} такую дребедень.

Но так и не понял как сделать так чтобы в combobox добавлялись данные о сетевом подключении именно НАЗВАНИЕ ну и иконку в зависимости от типа подключения. делаю так

в процедуру lv_netData

вставляю код
Код:
sComBobox1.Items.Add(TempList[0]);// Добовляем в Combobox наименование адаптора
      sComBobox2.Items.Add(TempList[1]);
      sComBobox3.Items.Add(TempList[2]);
но в каждый из них добавляется по 3 раза одно и тоже, как от этого избавиться ????
RainMEN2009 вне форума Ответить с цитированием
Старый 29.03.2012, 16:52   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Ты бы еще в WndProc этот код вставил. Зачем ты вставляешь в запрещенную область кода? Твой код там работать не будет. Значение функции выдает структурированную строку. Вызывай функцию, получай строку и в цикле заполняй комбобокс. По коду видно, как с ней работать, на примере той же lv_netData.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 30.03.2012, 06:42   #7
RainMEN2009
 
Регистрация: 25.03.2012
Сообщений: 5
По умолчанию

Да это я понял что строка содержащая название подключения + название атаптера + мас адрес. А как это забить эти данные в Combobox так и не дошло, укажи в какую сторону нужно нужно копать чтобы выводить в combobox название адаптера, ну или примерчик какой-нибудь =)
RainMEN2009 вне форума Ответить с цитированием
Старый 30.03.2012, 22:14   #8
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Держи пример (смотри новую процедуру ShowInComboBox), лень объяснять, все равно врядли поймешь.
NET_INFO.rar
Спасибо не стесняемся в репу ставить)
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 01.04.2012, 12:41   #9
RainMEN2009
 
Регистрация: 25.03.2012
Сообщений: 5
По умолчанию

Спасибо=) Очень помогло =)
RainMEN2009 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу разобраться feesta Помощь студентам 3 17.09.2011 23:46
не могу разобраться feesta Помощь студентам 0 10.04.2011 20:19
не могу разобраться! Apsalon Microsoft Office Excel 1 28.12.2010 18:54
НЕ могу разобраться Smagulov85 БД в Delphi 9 29.09.2010 16:13
не могу разобраться Инспектор ГУЛ Свободное общение 7 20.09.2009 09:29