Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Getclassname [D6, Win2k]


SeF ©   (2002-04-02 02:57:00) 

подскажите что не так?
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
name:string;
begin
setlength(name,255);
//fillchar(name,255,#0);
GetCursorPos(p);
GetClassName(WindowFromPoint(p),@name,255);
edit1.Text:=name; {1}
end;


в 1 все время "Access violation at address 00404242 in module Project1.exe" read of address 726F464C
компилится без проблем...


Fantasist   (2002-04-05 02:48:00) [1]

Естесвенно,она вылетала после выхода, так как ты передавал переменную типа string изменялся сам указатель, и исключение происходило когда компилятор пытался удалить память из под string которая указывала неизвестно куда.


SeF   (2002-04-05 01:00:00) [2]

Всем БОЛЬШОЕ СПАСИБО!заработало. Ошибка вылетала действительго после выхода, но после изменения кода действительно ВСЕ ok. еще рас спасибо!


Fantasist   (2002-04-04 22:30:00) [3]

>проблема в том что проседура выполнятся, а ошибка после выхода >из процедуры......

ПОСЛЕ выхода? Ну, тогда дело в чем-то другом. У меня так все четко, оба кода которые я привел работают совершенно коректно. Ты их у себя пробывал?


Romkin   (2002-04-04 14:10:00) [4]


procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
WndName:string;
Wnd: HWnd;
nSize: integer;
begin
GetCursorPos(p);
Wnd := WindowFromPoint(p);
SetLength(wndName,255); //max
nSize := GetClassName(Wnd,PChar(WndName),255);
if nSize = 0 then exit; //Error
SetLength(WndName,nSize + 1);
nSize := GetClassName(Wnd,PChar(WndName),nSize + 1);
edit1.Text:=WndName;
end;


SeF   (2002-04-04 13:49:00) [5]

>Fantasist
проблема в том что проседура выполнятся, а ошибка после выхода из процедуры......


Fantasist   (2002-04-04 05:53:00) [6]

Да, пару комментариев.
1. Как вам выше сказали, если у вас name типа string, то адрес ее надо передавать как @name[1], иначе вы передаете не адрес строки, а адрес указателя и облом.
2. Не стоит забивать ANSI строку нулями - ноль символ окончания строки.
То есть так тоже будет работать:

procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:string;
begin
sleep(2000);
setlength(name,255);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),@name[1],255)>0 then
messagebox(0,@name[1],pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
end;


Fantasist   (2002-04-04 05:46:00) [7]

Эхе-ех. :)
Вот, получите. :)

procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:PChar;
begin
sleep(2000);
name:=StrAlloc(255);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),name,255)>0 then
messagebox(0,name,pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
end;


SeF   (2002-04-04 02:56:00) [8]

последние испытания:

procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:string;
begin
sleep(2000);
//str:=tstringlist.Create;
setlength(name,255);
fillchar(name,255,#0);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),@name,255)>0 then
messagebox(0,@name,pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
//edit1.Text:=name;
//str.Free;
end;


в итоге через 1-2 sec получаем http://seff.pisem.net/images/error.jpg


SeF   (2002-04-04 02:27:00) [9]

>Adder © после выхода из проседуры проходит 1-2 sec и access violation at 0x00000000: read address 0x00000000.
а класс не показывает


Adder   (2002-04-04 00:27:00) [10]

2Doom ;)
type TPoint = record
X: Longint;
Y: Longint;
end;


Doom   (2002-04-04 00:24:00) [11]

А вачале p:= Create (TPoint) или как там не надо писать?


Adder   (2002-04-04 00:21:00) [12]

GetClassName(WindowFromPoint(p),@name[1],255);


SeF   (2002-04-03 02:10:00) [13]

>SoftOne
вместо
edit1.Text:=name;
нвписать
messagebox(0,pchar(name),pchar(""),0);
то все ok
да и если name:pchar;то таже самая ошибка...


SoftOne   (2002-04-02 03:50:00) [14]

Читаем хелп по GetClassName. И видим, что вторым параметром в ней идет "LPTSTR", т.е. "Long Pointer To String", т.е. PChar.
"name" у тебя "string" - это плюс! Но @name - это минус, поскольку указывает не на область данных, а на "область указателя на область данных"!


Наверх

Титульная страница Поиск, карта сайта Написать письмо