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

Вниз

GetwindowmoduleFilename не работает   Найти похожие ветки 

 
mahab ©   (2009-03-11 22:11) [0]

Привет всем. Вот код. Ф-я 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-11 23:26) [1]


> mahab ©   (11.03.09 22:11)  

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

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

> enumwindows(@TForm1.back,0);

Кошмар.

--
Regards, LVT.


 
Cobalt ©   (2009-03-12 12:58) [2]

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

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

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


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

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


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

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


 
Leonid Troyanovsky ©   (2009-03-12 18:48) [5]


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

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

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

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

--
Regards, LVT.


 
mahab ©   (2009-03-15 15:18) [6]

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


 
Leonid Troyanovsky ©   (2009-03-15 15:52) [7]


> 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.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
2-1237115554
Shyrick
2009-03-15 14:12
2009.04.26
Как отключить кнопку печати при предпросмотре документа exel


3-1219755637
Курдль
2008-08-26 17:00
2009.04.26
Очистить всю таблицу DBF с помощью SQL


2-1236871080
Mikle
2009-03-12 18:18
2009.04.26
не находит контрол на форме


15-1235597402
Юрий
2009-02-26 00:30
2009.04.26
С днем рождения ! 26 февраля 2009 четверг


15-1235497716
NoDt
2009-02-24 20:48
2009.04.26
Вопрос о wi-fi маршрутизаторах.