Главная страница
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.019 c
15-1234884844
Baks
2009-02-17 18:34
2009.04.26
Рисунки для игры


15-1235338994
alex-drob
2009-02-23 00:43
2009.04.26
перевод из integer в byte и наоборот


2-1236523735
Руслан
2009-03-08 17:48
2009.04.26
Работа с DBF


15-1235553818
DVM
2009-02-25 12:23
2009.04.26
Работа программиста - это сон?!


2-1237132220
lonely_angel
2009-03-15 18:50
2009.04.26
Точки на карте