Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
3-57629
Yuri Btr
2002-03-28 12:18
2002.04.18
Изменение формата базы данных!


6-57826
Stanislav
2002-02-06 13:17
2002.04.18
Изменение настроек WebBrowser


1-57707
Delph
2002-04-08 12:29
2002.04.18
Ошибка при динамическом вызове DLL


1-57736
pusrg
2002-04-03 20:33
2002.04.18
Получение значения по указателю.


3-57583
Sysoper
2002-03-26 12:27
2002.04.18
At End Of Table





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский