Главная страница
    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.48 MB
Время: 0.041 c
1-1121244630
Вольный Стрелок
2005-07-13 12:50
2005.07.31
Консольное приложение - косой вывод кириллицы на экран


1-1121068357
Grant
2005-07-11 11:52
2005.07.31
Работа с компонентом Image


14-1120835121
Piter
2005-07-08 19:05
2005.07.31
Никто не хочет нанять на работу перспективных программистов?


1-1121063954
Andy BitOff
2005-07-11 10:39
2005.07.31
Word: запустить, проследить, узнать о результатах.


10-1098365364
Квэнди
2004-10-21 17:29
2005.07.31
Excel и объединенные ячейки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский