Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
есть такой трабл читаю свойства сетевой карты через стандартную библиотечку Iphlpapi.dll, свойства карточки прекрасно читаются, обработываются, но как тока обработчик события Button1Click заканчивается ( причем нормально ) возникает Access Violation . . . текст проги: const MAX_ADAPTER_NAME_LENGTH = 256; MAX_ADAPTER_DESCRIPTION_LENGTH = 128; MAX_ADAPTER_ADDRESS_LENGTH = 8; type //------IP address structures--------------------------------------------------- PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING; IP_ADDRESS_STRING = array[0..15] of char; // IP as string PIP_ADDR_STRING = ^IP_ADDR_STRING; IP_ADDR_STRING = record Next: PIP_ADDR_STRING; IpAddress: IP_ADDRESS_STRING; IpMask: IP_ADDRESS_STRING; Context: DWORD; end; //------ADAPTER INFO STRUCTURES------------------------------------------------- PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO; IP_ADAPTER_INFO = record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char; Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char; AddressLength: UINT; Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; Index: DWORD; aType: UINT; DHCPEnabled: UINT; CurrentIPAddress: PIP_ADDR_STRING; IPAddressList: IP_ADDR_STRING; GatewayList: IP_ADDR_STRING; DHCPServer: IP_ADDR_STRING; HaveWINS: BOOL; PrimaryWINSServer: IP_ADDR_STRING; SecondaryWINSServer: IP_ADDR_STRING; LeaseObtained: LongInt; LeaseExpires: LongInt; SpareStuff: array [1..200] of char; end; ... function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; pOutBufLen: PULONG): DWORD; stdcall; external 'Iphlpapi.dll' name 'GetAdaptersInfo'; ... procedure TfrmMain.Button1Click(Sender: TObject); const OutBufLen: ULONG = 2000; AddrLen = 6; var AdapterInfo: IP_ADAPTER_INFO; Result: DWORD; i: integer; Next: PIP_ADAPTER_INFO; Str: string; begin mMAClist.Lines.Add('-----------------------------'); mMAClist.Lines.Add('Network adapter Info'); mMAClist.Lines.Add('-----------------------------'); Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen); if Result = 0 then begin Next:= @AdapterInfo; repeat mMAClist.Lines.Add('Description: '+ Next^.Description); Str:='MAC address: '; for i := 0 to AddrLen do begin Str:=Str+IntToHex(Next^.Address , 2); if i <> AddrLen then {write('-')}Str:=Str+'-'; end; mMAClist.Lines.Add(Str); Next:= AdapterInfo.Next; mMAClist.Lines.Add(''); mMAClist.Lines.Add(''); until Next = nil; end else mMAClist.Lines.Add('Error. Result code: '+ IntToStr(Result)); ShowMessage('12345'); end; порле того как нажмешь OK на сообщении "12345" возникает Access violation или доступ по адресу 000000000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 09:37 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
Предположений может быть много, начиная с ... mMAClist инициализирован ? И вообще - отсекайте лишнее, пока не уткнетесь в конкретную проблему... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 10:01 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
mMAClist - это TMemo лежит на форме type TfrmMain = class(TForm) Button1: TButton; mMAClist: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; в пошаговом режиме доходит до end;(обработка ButtonClick), после него думает секунд 5 и выпадывает табличка "Access violation 0x0000000: read of adress 0x0000000" и указатель окна CPU стоит на адресе 0000000, а вверху окна надпись Thread #NNNN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 10:15 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
Данная ошибка возникает когда какой-то объект не проинициализирован. Возможно, что это происходит не в данном обработчике, а где-то после него. Что там потом программа у Вас делает? Далее, в коде присутствует получение данных на указатель. Память под них, я так понимаю, выделяется внутри dll. Но я не увидел места, где эта память потом освобождается. То есть, получается, что вся эта цепочка AdapterInfo после выхода из обработчика "повисает в воздухе"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 10:29 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
прога больше ничего неделает ( я хотел проверить как эта ф-я работать будет - и сразу такой глюк ) вот полный сорц: --------- MAC.dpr ------- program MAC; uses Forms, untMain in 'untMain.pas' {frmMain}; {$R *.res} begin Application.Initialize; Application.CreateForm(TfrmMain, frmMain); Application.Run; end. ------- untMain.pas -------- unit untMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmMain = class(TForm) Button1: TButton; mMAClist: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; const MAX_ADAPTER_NAME_LENGTH = 256; MAX_ADAPTER_DESCRIPTION_LENGTH = 128; MAX_ADAPTER_ADDRESS_LENGTH = 8; type //------IP address structures------------------------------------------------ PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING; IP_ADDRESS_STRING = array[0..15] of char; // IP as string PIP_ADDR_STRING = ^IP_ADDR_STRING; IP_ADDR_STRING = record Next: PIP_ADDR_STRING; IpAddress: IP_ADDRESS_STRING; IpMask: IP_ADDRESS_STRING; Context: DWORD; end; //------ADAPTER INFO STRUCTURES------------------------------------------ PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO; IP_ADAPTER_INFO = record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char; Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char; AddressLength: UINT; Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; Index: DWORD; aType: UINT; DHCPEnabled: UINT; CurrentIPAddress: PIP_ADDR_STRING; IPAddressList: IP_ADDR_STRING; GatewayList: IP_ADDR_STRING; DHCPServer: IP_ADDR_STRING; HaveWINS: BOOL; PrimaryWINSServer: IP_ADDR_STRING; SecondaryWINSServer: IP_ADDR_STRING; LeaseObtained: LongInt; LeaseExpires: LongInt; SpareStuff: array [1..200] of char; end; function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; pOutBufLen: PULONG): DWORD; stdcall; external 'Iphlpapi.dll' name 'GetAdaptersInfo'; implementation {$R *.dfm} procedure TfrmMain.Button1Click(Sender: TObject); const OutBufLen: ULONG = 2000; AddrLen = 6; var AdapterInfo: IP_ADAPTER_INFO; Result: DWORD; i: integer; Next: PIP_ADAPTER_INFO; Str: string; begin mMAClist.Lines.Add('-----------------------------'); mMAClist.Lines.Add('Network adapter Info'); mMAClist.Lines.Add('-----------------------------'); Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen); if Result = 0 then begin Next:= @AdapterInfo; repeat mMAClist.Lines.Add('Description: '+ Next^.Description); Str:='MAC address: '; for i := 0 to AddrLen do begin Str:=Str+IntToHex(Next^.Address , 2); if i <> AddrLen then Str:=Str+'-'; end; mMAClist.Lines.Add(Str); Next:= AdapterInfo.Next; mMAClist.Lines.Add(''); mMAClist.Lines.Add(''); until Next = nil; end else mMAClist.Lines.Add('Error. Result code: '+ IntToStr(Result)); ShowMessage('12345'); end; end. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 10:42 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
может я как-то нетак внешнюю ф-ю из dll-ки вызываю ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 10:42 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
память как обычно Пушкин выделять будет? держи пример procedure TForm1.Button2Click(Sender: TObject); var info : PIP_ADAPTER_INFO; next : PIP_ADAPTER_INFO; size : longword; errorcode : DWORD; i: Integer; Str: string; begin size := sizeof( info ); errorcode := GetAdaptersInfo( nil, @size ); GetMem( info, size ); FillMemory( info, size, 0 ); errorcode := GetAdaptersInfo( info, @size ); if errorcode = ERROR_SUCCESS then begin next := info; while next <> nil do begin mMAClist.Lines.Add('Description: '+ Next^.Description); for i := 1 to 6 do begin Str:=Str+IntToHex(Next^.Address , 2); if i <> 6 then Str:=Str+'-'; end; mMAClist.Lines.Add('MAC address: '+ Str); next := next^.Next; end; end; FreeMem( info ); case errorCode of ERROR_BUFFER_OVERFLOW: ShowMessage( 'Buffer Overflow' ); ERROR_INVALID_PARAMETER: ShowMessage( 'Invalid Parameter' ); ERROR_NO_DATA: ShowMessage( 'No adapter is installed' ); ERROR_NOT_SUPPORTED: ShowMessage( 'Not Supported' ); end; end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 10:57 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
А я и не заметил, что память не выделена. Увидел только, что не освобождается. :) Кстати, тогда понятно, почему у вас косяк. функция из dll, когда вы ей передаёте непроинициализированный указаетль, просто затирает какую-то область на стеке своими данными. И всё накрывается в тот момент, когда процессор при выходе из подпрограммы обработки события пытается с затёртого стека считать адрес возврата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2003, 16:22 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
я немного недопонял о каком таком невыделении памяти идет речь ? у вас в локальных переменных ф-ии записано info : PIP_ADAPTER_INFO; next : PIP_ADAPTER_INFO; т.е. определены указатели (а не переменные) - ессно тут надо выделять память под данные, но если у меня прописана локальная переменная var AdapterInfo: IP_ADAPTER_INFO; адрес которой собственно и указан при вызове ф-ии Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen); или вы господа будете утверждать что при объявлении переменных в разделе var под них невыделяется память ? - это нонсенс хотя вы мне подали очень интересную идею - скорее всего ф-я возвращает больше данных чем размер IP_ADAPTER_INFO; и тогда она действительно может затереть что-нить лишнее в памяти но насчет того что память небыла выделена - совершенно несогласен, так же как и стем что она небыла освобождена - при выходе из процедуры освобождается память от всех локальных переменных ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 07:48 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
совершенно согласен с последней репликой автора. есть мысль попробовать покопать в след. направлении... в структуре объявлены массивы из символов. Я так понимаю, dll должна влить туда инфо. Так вот мне не понравилось что массив объявлен как [1..N]... мне кажется надо [0..N] или что еще лучше объявить переменную как PChar и выделить ей необходимый объем памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 08:24 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
CiD писал:... но если у меня прописана локальная переменная var AdapterInfo: IP_ADAPTER_INFO; адрес которой собственно и указан при вызове ф-ии Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen); или вы господа будете утверждать что при объявлении переменных в разделе var под них невыделяется память ? - это нонсенс Да нет, не нонсенс - если посмотреть, что такое IP_ADAPTER_INFO: IP_ADAPTER_INFO = record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char; Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char; AddressLength: UINT; Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; Index: DWORD; aType: UINT; DHCPEnabled: UINT; CurrentIPAddress: PIP_ADDR_STRING ; IPAddressList: IP_ADDR_STRING; GatewayList: IP_ADDR_STRING; DHCPServer: IP_ADDR_STRING; HaveWINS: BOOL; PrimaryWINSServer: IP_ADDR_STRING; SecondaryWINSServer: IP_ADDR_STRING; LeaseObtained: LongInt; LeaseExpires: LongInt; SpareStuff: array [1..200] of char; end; А для выделенного мною откуда память возьмется??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 09:19 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
выделенный параметр вообще говоря возвращает NIL на сайте MSDN написано - CurrentIpAddress -Reserved. память для самого указателя выделена при определении переменной в разделе VAR под что еще выделять память ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 10:02 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
Блин, можно, конечно так рассуждать долго, но кто мешает локализовать проблему - сначала оставить в процедуре 3 строчки, остальное закомментарить, далее еще добавить парочку и т.д. Сужать надо круг поиска... А то мне вспоминаются добрые старые времена, когда мы в 15 метрах распечаток ошибки искали :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 10:56 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
проблема то локализована - если закомментировать строчку вызова ф-ии ...GetAdaptersInfo(...) то таких ошибок невозникает, но ведь неглючит же сама ф-я! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2003, 15:22 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
А что же говорит Result - ошибка при вызове возникает или нет... А почему это OutBufLen = 2000 ? Вы уверены, что размер IP_ADAPTER_INFO именно таков ? И, например, могу подкинуть цитатку : DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, // buffer to receive data PULONG pOutBufLen // size of data returned ); Parameters pAdapterInfo [out] Pointer to a buffer that receives a linked list of IP_ADAPTER_INFO structures. Уловили ? А SpareStuff не сильно-то большой :-) Массивчик структур надо бы .... И без всяких SpareStuff - размер структуры должен соответствовать объявленному. И константы, задающие буфера, я бы еще проверил ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2003, 16:19 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
моя реплика без внимания... чтож удачи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 03:45 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
2 Cid: твоя проблема в том, что ты откуда-то взял цифру OutBufLen: ULONG = 2000; Если ты передашь в функцию правильный размер структуры, то все будет нормально и с локальной переменной. Например так: i:=SizeOf(AdapterInfo); Result:= GetAdaptersInfo(Next, @i); Но это сработает только для 1 адаптера :) для большего количества придется выделять память самому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 07:22 |
|
||
|
Access violation . . .
|
|||
|---|---|---|---|
|
#18+
to StarWind: твоя реблика не без внимания - я проверял, но результат тот же . . . to srf2000: рулез, точно в этом и есть проблема . . . OutBuffer=2000 я взял из примера в инете, сейчас допер - верно у меня структура AdaptersInfo меньше чем 2000 поэтому когда ф-я возвращает результат затирает "лишнего" - отсюда ошибка спасибо всем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2003, 08:35 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32232396&tid=2117370]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 366ms |

| 0 / 0 |
