powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access violation . . .
19 сообщений из 19, страница 1 из 1
Access violation . . .
    #32229608
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой трабл
читаю свойства сетевой карты через стандартную библиотечку 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
...
Рейтинг: 0 / 0
Access violation . . .
    #32229636
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Access violation . . .
    #32229645
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположений может быть много, начиная с ... mMAClist инициализирован ?
И вообще - отсекайте лишнее, пока не уткнетесь в конкретную проблему...
...
Рейтинг: 0 / 0
Access violation . . .
    #32229668
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Access violation . . .
    #32229691
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данная ошибка возникает когда какой-то объект не проинициализирован. Возможно, что это происходит не в данном обработчике, а где-то после него. Что там потом программа у Вас делает?

Далее, в коде присутствует получение данных на указатель. Память под них, я так понимаю, выделяется внутри dll. Но я не увидел места, где эта память потом освобождается. То есть, получается, что вся эта цепочка AdapterInfo после выхода из обработчика "повисает в воздухе"?
...
Рейтинг: 0 / 0
Access violation . . .
    #32229704
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прога больше ничего неделает ( я хотел проверить как эта ф-я работать будет - и сразу такой глюк )

вот полный сорц:

--------- 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.
...
Рейтинг: 0 / 0
Access violation . . .
    #32229705
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может я как-то нетак внешнюю ф-ю из dll-ки вызываю ?
...
Рейтинг: 0 / 0
Access violation . . .
    #32229728
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
память как обычно Пушкин выделять будет?
держи пример

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;
...
Рейтинг: 0 / 0
Access violation . . .
    #32230284
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я и не заметил, что память не выделена. Увидел только, что не освобождается. :)

Кстати, тогда понятно, почему у вас косяк. функция из dll, когда вы ей передаёте непроинициализированный указаетль, просто затирает какую-то область на стеке своими данными. И всё накрывается в тот момент, когда процессор при выходе из подпрограммы обработки события пытается с затёртого стека считать адрес возврата.
...
Рейтинг: 0 / 0
Access violation . . .
    #32230650
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я немного недопонял о каком таком невыделении памяти идет речь ?
у вас в локальных переменных ф-ии записано
info : PIP_ADAPTER_INFO;
next : PIP_ADAPTER_INFO;
т.е. определены указатели (а не переменные) - ессно тут надо выделять память под данные, но если у меня прописана локальная переменная
var
AdapterInfo: IP_ADAPTER_INFO;
адрес которой собственно и указан при вызове ф-ии
Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen);

или вы господа будете утверждать что при объявлении переменных в разделе
var
под них невыделяется память ? - это нонсенс

хотя вы мне подали очень интересную идею - скорее всего ф-я возвращает больше данных чем размер IP_ADAPTER_INFO; и тогда она действительно может затереть что-нить лишнее в памяти
но насчет того что память небыла выделена - совершенно несогласен, так же как и стем что она небыла освобождена - при выходе из процедуры освобождается память от всех локальных переменных !
...
Рейтинг: 0 / 0
Access violation . . .
    #32230666
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
совершенно согласен с последней репликой автора.
есть мысль попробовать покопать в след. направлении...
в структуре объявлены массивы из символов. Я так понимаю, dll должна влить туда инфо. Так вот мне не понравилось что массив объявлен как [1..N]... мне кажется надо [0..N] или что еще лучше объявить переменную как PChar и выделить ей необходимый объем памяти.
...
Рейтинг: 0 / 0
Access violation . . .
    #32230706
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
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;

А для выделенного мною откуда память возьмется???
...
Рейтинг: 0 / 0
Access violation . . .
    #32230744
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выделенный параметр вообще говоря возвращает NIL
на сайте MSDN написано - CurrentIpAddress -Reserved.
память для самого указателя выделена при определении переменной в разделе VAR

под что еще выделять память ?
...
Рейтинг: 0 / 0
Access violation . . .
    #32230803
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, можно, конечно так рассуждать долго, но кто мешает локализовать проблему - сначала оставить в процедуре 3 строчки, остальное закомментарить, далее еще добавить парочку и т.д. Сужать надо круг поиска... А то мне вспоминаются добрые старые времена, когда мы в 15 метрах распечаток ошибки искали :-)
...
Рейтинг: 0 / 0
Access violation . . .
    #32231335
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема то локализована - если закомментировать строчку вызова ф-ии ...GetAdaptersInfo(...) то таких ошибок невозникает,
но ведь неглючит же сама ф-я!
...
Рейтинг: 0 / 0
Access violation . . .
    #32232171
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что же говорит 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 - размер структуры должен соответствовать объявленному. И константы, задающие буфера, я бы еще проверил ...
...
Рейтинг: 0 / 0
Access violation . . .
    #32232371
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
моя реплика без внимания... чтож удачи...
...
Рейтинг: 0 / 0
Access violation . . .
    #32232396
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Cid: твоя проблема в том, что ты откуда-то взял цифру OutBufLen: ULONG = 2000;
Если ты передашь в функцию правильный размер структуры, то все будет нормально и с локальной переменной. Например так:
i:=SizeOf(AdapterInfo);
Result:= GetAdaptersInfo(Next, @i);

Но это сработает только для 1 адаптера :) для большего количества придется выделять память самому.
...
Рейтинг: 0 / 0
Access violation . . .
    #32232428
cid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to StarWind:
твоя реблика не без внимания - я проверял, но результат тот же . . .

to srf2000:
рулез, точно в этом и есть проблема . . .
OutBuffer=2000 я взял из примера в инете,
сейчас допер - верно у меня структура AdaptersInfo меньше чем 2000
поэтому когда ф-я возвращает результат затирает "лишнего" - отсюда ошибка

спасибо всем!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access violation . . .
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]