Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.18;
Скачать: CL | DM;

Вниз

Getclassname   Найти похожие ветки 

 
SeF ©   (2002-04-02 02:57) [0]

подскажите что не так?
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
компилится без проблем...


 
SoftOne ©   (2002-04-02 03:50) [1]

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


 
SeF ©   (2002-04-03 02:10) [2]

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


 
Adder ©   (2002-04-04 00:21) [3]

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


 
Doom ©   (2002-04-04 00:24) [4]

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


 
Adder ©   (2002-04-04 00:27) [5]

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


 
SeF ©   (2002-04-04 02:27) [6]

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


 
SeF ©   (2002-04-04 02:56) [7]

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

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


 
Fantasist   (2002-04-04 05:46) [8]

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

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;


 
Fantasist   (2002-04-04 05:53) [9]

Да, пару комментариев.
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;



 
SeF ©   (2002-04-04 13:49) [10]

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


 
Romkin ©   (2002-04-04 14:10) [11]


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;


 
Fantasist   (2002-04-04 22:30) [12]

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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.04.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
3-57584
Roman_tutov@mail.ru
2002-03-22 18:57
2002.04.18
Delphi & postgress


3-57596
anod
2002-03-26 22:31
2002.04.18
2 Простых вопроса


4-57927
alexey1
2002-02-13 04:09
2002.04.18
icons


3-57610
Deirdra
2002-03-27 15:19
2002.04.18
DBGrid&Lookup


1-57785
Sergey_R
2002-04-05 18:36
2002.04.18
Нетрадиционный вопрос!