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

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

GetwindowmoduleFilename не работает


mahab ©   (2009-03-11 22:11:00) 

Привет всем. Вот код. Ф-я GetwindowmoduleFilename всегда возвращает 0. Почему?
procedure TForm1.Button1Click(Sender: TObject);
begin
enumwindows(@TForm1.back,0);

end;
procedure Tform1.back(h:Thandle);
var
AHandle:Thandle;
szFileName:array[0..255] of char;
WindowStyle:INTEGER;
d:cardinal;
begin
if h=0 then exit;
d:= GetwindowmoduleFilename(h,szFileName, 256);
 if d= 0
   then
ZeroMemory(@szFileName[0], 255)
   else
 begin
WindowStyle := GetWindowLong(h, GWL_STYLE);
   if WindowStyle=WindowStyle and Longint(WS_VISIBLE) then
     form1.Memo1.Lines.Add(string(szFileName)+'  '+ 'visible') else
   form1.Memo1.Lines.Add(string(szFileName)+'  '+ 'hidden');
 end;
end;


Leonid Troyanovsky   (2009-03-15 15:52:00) [1]


> mahab ©   (15.03.09 15:18) [6]

> Моя ошибка заключалась в том, что callback ф-я имеет определенный

Это не единственная ошибка.
Не следует использовать метод там, где должна быть регулярная процедура,
да еще и с неправильным прототипом. Если уж так хочется передать туда
объект, то у EnumWindows есть параметр.

form1.Memo1 - так не пишут в обработчиках TForm1, да и во-ще,
про переменные формы лучше забыть навсегда.

При вызовах API функций необходимо анализировать результат, например,
Win32check(GetwindowmoduleFilename() <>0)
Win32Check(EnumWindows()<>0)

И почему это 255, когда MAX_PATH.

> GetwindowmoduleFilename в XP НЕ РАБОТАЕТ

Работает, правда, с окнами своего процесса.
http://support.microsoft.com/?id=228469

--
Regards, LVT.


mahab   (2009-03-15 15:18:00) [2]

Не буду реагировать на оскорбительные выпады- языком молоть не мешки ворочать.
Моя ошибка заключалась в том, что callback ф-я имеет определенный синтаксис и должна была быть вызвана stdcall.   И еще: GetwindowmoduleFilename в XP НЕ РАБОТАЕТ
. Cobalt большое спасибо.


Leonid Troyanovsky   (2009-03-12 18:48:00) [3]


> mahab ©   (12.03.09 18:12) [4]

> не хочет работать

Мыслительная мышца.

Уже все разжевано.

--
Regards, LVT.


mahab   (2009-03-12 18:12:00) [4]

Так и есть - недопустимый дескриптор. Но почему. Получается не хочет работать enumwindows.


Cobalt   (2009-03-12 13:00:00) [5]

поэтому h не равен 0, но и не является валидным хендлом.
А стек не ломается потому, что его очищает enumwindows.


Cobalt   (2009-03-12 12:58:00) [6]

> enumwindows(@TForm1.back,0);
2 mahab ©
не стоит передавать методы класса как отдельные функции. А то еще вздумается обратиться к полям класса...

Не забудь о порядке вызова - WinAPI-ые функции, кажется, используют везде stcall, а не register(как в Паскале)

Насчет  
if d= 0
Подозреваю, что в h - мусор, который твоя procedure Tform1.back(h:Thandle);берет из стека (он ведь не чиститься).


Leonid Troyanovsky   (2009-03-11 23:26:00) [7]


> mahab ©   (11.03.09 22:11)  

> Привет всем. Вот код. Ф-я GetwindowmoduleFilename всегда
> возвращает 0. Почему?

Есть такая функция - GetLastError.

> enumwindows(@TForm1.back,0);

Кошмар.

--
Regards, LVT.


Наверх

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