Текущий архив: 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