Текущий архив: 2005.07.31;
Скачать: CL | DM;
ВнизНепонятная AV Найти похожие ветки
← →
DeepProg (2005-07-08 14:18) [0]Форма, memo, listbox, edit, 2 button"a.
Почему так все работает нормально:
{жмем сначала Button1, потом Button2}
procedure TForm1.Button1Click(Sender: TObject);
var
wsadt : wsadata;
icmp :icmpecho;
HNDicmp : integer;
hndFile :integer;
Host :PHostEnt;
Destino :in_addr;
Endereco :^DWORD;
IP : ipinfo;
Retorno :integer;
dwRetorno :DWORD;
x :integer;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle : TIcmpCloseHandle;
IcmpSendEcho : TIcmpSendEcho;
begin
if (edit1.Text = "") then
begin
Application.MessageBox("Enter a HostName ro a IP Adress", "Error", MB_OK);
exit;
end;
HNDicmp := LoadLibrary("ICMP.DLL");
if (HNDicmp <> 0) then
begin
@IcmpCreateFile := GetProcAddress(HNDicmp,"IcmpCreateFile");
@IcmpCloseHandle := GetProcAddress(HNDicmp,"IcmpCloseHandle");
@IcmpSendEcho := GetProcAddress(HNDicmp,"IcmpSendEcho");
if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or (@IcmpSendEcho=nil) then
begin
Application.MessageBox("Error getting ICMP Adress","Error", MB_OK);
FreeLibrary(HNDicmp);
end;
end;
Retorno := WSAStartup($0101,wsadt);
if (Retorno <> 0) then
begin
Application.MessageBox("Canút Load WinSockets","WSAStartup", MB_OK);
WSACleanup();
FreeLibrary(HNDicmp);
end;
Destino.S_addr := inet_addr(Pchar(Edit1.text));
if (Destino.S_addr = 0) then
Host := GetHostbyName(PChar(Edit1.text))
else
Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);
if (host = nil) then
begin
Application.MessageBox("Host not found","Error", MB_OK);
WSACleanup();
FreeLibrary(HNDicmp);
exit;
end;
memo1.Lines.Add(" Pinging " + Edit1.text);
Endereco := @Host.h_addr_list;
HNDFile := IcmpCreateFile();
for x:= 0 to 4 do
begin
Ip.Ttl := char(255);
Ip.Tos := char(0);
Ip.IPFlags := char(0);
Ip.OptSize := char(0);
Ip.Options := nil;
dwRetorno := IcmpSendEcho(
HNDFile,
Endereco^,
null,
0,
Ip,
Icmp,
sizeof(Icmp),
DWORD(5000));
Destino.S_addr := icmp.source;
Memo1.Lines.Add(" Ping " + Edit1.text);
end;
// IcmpCLoseHandle(HNDFile); - http://narod.yandex.ru/cgi-bin/yandmarkup?cluster=14&prog=0x2757571A&HndlQuery=229844864&PageNum=0&g=0&d=0&q0=1494069968 &p=
{см. примечания внизу страницы. Кстати, если вызывать эти функции через ...; stdcall; external "icmp.dll" Name "Icmp...", то ошибки при вызове ICmpCloseHandle не будет, но баг, о котором ниже, остается}
FreeLibrary(HNDicmp);
WSACleanup();
end;
procedure TForm1.Button2Click(Sender: TObject);
var tsl: tstringlist;
begin
tsl := tstringlist.create;
tsl.Add("Works");
ListBox1.Items := tsl;
tsl.Free;
end;
А если не нажимать на Button1 и на клик второй кнопки реагировать так:
procedure TForm1.Button2Click(Sender: TObject);
var tsl: tstringlist;
begin
Button1.Click;
tsl := tstringlist.create;
tsl.Add("Works");
ListBox1.Items := tsl; // то здесь будет AV??
tsl.Free;
end;
← →
Digitman © (2005-07-08 14:38) [1]отладчик на что существует, по-твоему ?
← →
DiamondShark © (2005-07-08 15:14) [2]Описания TIcmpCreateFile, TIcmpCloseHandle, TIcmpSendEcho где?
← →
DeepProg (2005-07-08 15:44) [3]Digitman © (08.07.05 14:38) [1]
Ты уже имел случай ознакомиться с уровнем моей подготовки. Если бы это был просто структурный код, или, хотя бы, не надо было лезть в объекную часть, debugger бы мне помог. Но я слишком слабо представяю себе эти механизмы, чтобы выделить baseline из прочих служебных данных. Я пытался, но трудно искать, когда не знгаешь, что именно.
Единственное предположение: неправильно аспределна память, но почему?
DiamondShark © (08.07.05 15:14) [2] Ну уж не подумай, что их нет! Достаточно было сходить по приведенной линке.
TIcmpCreateFile = function():integer;
{$IFDEF WIN32} stdcall; {$ENDIF}
TIcmpCloseHandle = procedure(var handle: integer);
{$IFDEF WIN32} stdcall; {$ENDIF}
TIcmpSendEcho = function(var handle: integer; endereco: DWORD;
buffer: variant; tam: WORD; IP: IPINFO; ICMP: ICMPECHO;
tamicmp: DWORD; tempo: DWORD): DWORD;
{$IFDEF WIN32} stdcall; {$ENDIF}
Повторюсь. Если вызов делать через stdcall; external "icmp.dll" Name "Icmp...", то IcmpCloseHandle выполняется (и по-моему, это не процедура, а функция), но проблемы не решает.
Вы сами попробуйте, может, сразу догадаетесь. Ну не верю я, что здесь есть что-то, требующее глубокого исследования.
← →
Digitman © (2005-07-08 16:06) [4]
> DeepProg (08.07.05 15:44) [3]
> не верю я, что здесь есть что-то, требующее глубокого исследования
может и нет ничего такого, и скорей всего так и есть.
но глядеть/вдумываться в большой ЧУЖОЙ код, в котором используются "свои" декларации, к тому же далеко не все приведенные здесь, желания, поверь, нет - проще прогнать это под отладчиком, чего невозможно сделать в 6 секунд из-за опять же неприведенных полностью деклараций
навскидку по описанию проблемы с AV могу лишь предположить, что тело Button1Click() где-то "гадит" поле TForm1.ListBox1
выяснить так это или нет оч просто : ставишь/ловишь брейкпойнт на строчке с AV, подводишь мыш.курсор к ListBox1 - ты должен увидеть хинт "()", если ссылка на объект не загажена
← →
DeepProg (2005-07-08 16:50) [5]Про боязнь debugger"a: я имел ввиду последовательное хождение по регистрам/сегментам/etc., а не breakpoint"aми по коду - уж на этом-то уровне я системой владею.
Извини, что сразу не сказал, что ссылка на объект недоступна( inaccessible value, по-моему говорит о недопустимо большом адресе, т.е. выход за пределы сегмента кода?)
Но почему ссылка теряется на именно объекты формы?
Адреса переменных (пробовал) не искажаются, но адреса любых компонент формы - 100%, причем независимо от того как инкапсулирован сканер - отдельной процедурой(акцент: полное отсутсвие взаиодействия с компонентами формы - просто получает строку с IP - вместо edit"a, и var TStringList вместо Memo) или процедурой-обработчиком события, когда используется приведенный код.
> "свои" декларации, к тому же далеко не все...
все, что могло быть написано человеком приведено либо по ссылке, либо в моих post"aх. Ничего лишнего. Я жа эти два дня уже понял, чт укрывательство кода мешает решению, поэтомуздесь я действительно привел все. Чтобы получить полный код, пожалуйста, сделай все как дано по ссылке http://narod.yandex.ru/cgi-bin/yandmarkup?cluster=14&prog=0x2757571A&HndlQuery=229844864&PageNum=0&g=0&d=0&q0=1494069968 , а потом добавть батон 2 на форму и впиши туда мой обработчик)
← →
Desdechado © (2005-07-08 17:09) [6]а какой вообще смысл вот этого?
tsl := tstringlist.create;
tsl.Add("Works");
ListBox1.Items := tsl;
tsl.Free;
присваиваешь указатель и объект по нему разрушаешь
как себя должен вести ListBox в этом случае?
Может, делать Assign?
← →
Stakan © (2005-07-08 17:40) [7]
> Может, делать Assign?
property Items: TStrings read FItems write SetItems;
procedure TCustomListBox.SetItems(Value: TStrings);
begin
if Style in [lbVirtual, lbVirtualOwnerDraw] then
case Style of
lbVirtual: Style := lbStandard;
lbVirtualOwnerDraw: Style := lbOwnerDrawFixed;
end;
Items.Assign(Value);
end;
так что не в этом дело
← →
Digitman © (2005-07-08 17:44) [8]
> имел ввиду последовательное хождение по регистрам/сегментам/etc
нечего тебе там пока делать, в окне CPU, задача этого пока не требует
> ссылка на объект недоступна( inaccessible value
и это подтверждает мое предположение
> почему ссылка теряется на именно объекты формы?
просто так уж тебе "повезло" ... при неправильной работе с буферами и указателями загадить можно все что угодно
а тот, что статью а-ля "Маааленькое PING-приложеньице" писал, - руки ему повыдергивать за "вольную интерпретацию" заголовков АПИ-ф-ций
сравни ПРАВИЛЬНЫЕ заголовки (см. ниже) с заголовками в статье :
TIcmpCreateFile = function():integer; stdcall;
TIcmpCloseHandle = function(handle: integer): boolean; stdcall;
TIcmpSendEcho = function(handle: integer; endereco: u_int;
buffer: pointer; tam: WORD; var IP: IPINFO; out ICMP: ICMPECHO;
tamicmp: DWORD; tempo: DWORD): DWORD; stdcall;
и делай выводы ..
Страницы: 1 вся ветка
Текущий архив: 2005.07.31;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.04 c