Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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&#250;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.5 MB
Время: 0.152 c
14-1120728878
IceBeerg
2005-07-07 13:34
2005.07.31
Антивирус NOD32 кто, что может сказать?


3-1119371214
Alex Romanskiy
2005-06-21 20:26
2005.07.31
Квадратный корень в iSQL в IB


14-1120815109
GRAND25
2005-07-08 13:31
2005.07.31
По просьбе Игорька...


1-1121086795
Dysan
2005-07-11 16:59
2005.07.31
построение сложных диалоговых форм на основе XML и XSL


1-1121146525
Igor_M
2005-07-12 09:35
2005.07.31
RX lib