Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Мультимедийный плеер на Ассемблере

14.04.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter

Мультимедийный плеер на Ассемблере

Сегодня будем программировать нечто действительно интересное, а именно универсальный мультимедийный плеер. Универсальность реализуется мощью функционала DirectShow, а также установленными в системе аудио- и видеокодеками. И пусть это не полноценное приложение, большинство основных функций плеера в нем будут реализованы.

Читать статью целиком »
Просмотров: 1190 | Комментариев: 8

Выполнение скриптов JScript и VBScript из памяти

29.02.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter

Выполнение скриптов JScript и VBScript из памяти

Windows Script Host - стандартный компонент операционной системы Windows - сервер выполнения скриптов на языках VBScript и JScript, а также на других, если их обработчики установлены в системе. Сценарии на WSH способны взаимодействовать с программами, имеющими объектный скриптовый интерфейс путем доступа к их объектам и свойствам. За счет этого сценарии могут выполнять операции с файлами и каталогами, системным реестром, базами данных, производить сложные расчеты, манипуляции со строками и т.п. Было бы большим упущением не задействовать подобную мощь в своих программах.

Читать статью целиком »
Просмотров: 1136 | Комментариев: 4

Упаковка и распаковка данных с помощью функций D3D

05.02.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter

Упаковка и распаковка данных с помощью функций D3D

Функции Microsoft High Level Shader Language (HLSL) изначально предназначены для работы с шейдерами в различных графических приложениях. Но, как выяснилось, с помощью некоторых из этих функций можно весьма эффективно сжимать данные, а потом распаковывать их.

Читать статью целиком »
Просмотров: 1075 | Комментариев: 5

Как получить список подсказок у иконок в трее

23.01.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня снова будем издеваться над треем. На этот раз для доступа к данным в трее будем использовать средства интерфейса IAccessible, ранее мы его уже применяли, но немного для других задач.

Структуры, константы, интерфейсы и все остальное уже расписано в статье по ссылке выше, дублировать не буду. Как пройтись по иерархии окон Проводника и получить хэндл трея с иконками тут тоже было немало примеров. Переходим к основной части.
  1.         ; Получить информацию о выбранном элементе
  2.         ; [hTray] - хэндл окна трея с иконками
  3.         invoke  AccessibleObjectFromWindow,[hTray],OBJID_CLIENT,\
  4.                 CLSID_IAccessible,pAcc
  5.  
  6.         ; Количество элементов в окне
  7.         mov     eax,[pAcc]
  8.         mov     eax,[eax]
  9.         stdcall dword [eax+IAccessible.get_accChildCount],[pAcc],tmp
  10.  
  11.         invoke  wsprintf,buff,mask1,[tmp]
  12.         add     esp,12
  13.         stdcall AddLog,[hwmain],ID_LOG,buff
  14.  
  15.         ; Начинаем перебирать с 1 элемента
  16.         mov     ebx,1
  17. loc_loop:
  18.         ; Выделить память под строку
  19.         invoke  SysAllocString,szNull
  20.         mov     [bstrName],eax
  21.  
  22.         ; Получить название выбранного элемента
  23.         push    [bstrName]
  24.         mov     [varChild.vt],VT_I4
  25.         mov     [varChild.lVal],ebx
  26.         mov     eax,varChild
  27.         push    dword [eax+0Ch]
  28.         push    dword [eax+08h]
  29.         push    dword [eax+04h]
  30.         push    dword [eax]
  31.         mov     eax,[pAcc]
  32.         mov     eax,[eax]
  33.         stdcall dword [eax+IAccessible.get_accName],[pAcc]
  34.  
  35.         ; Строка подсказки
  36.         mov     eax,[bstrName]
  37.         mov     eax,[eax]
  38.         ; EAX -> строка подсказки
  39.  
  40.         ; Прибраться за собой
  41.         invoke  SysFreeString,[bstrName]
  42.  
  43.         ; Следующий элемент
  44.         inc     ebx
  45.         cmp     ebx,[tmp]
  46.         jbe     loc_loop
  47.  
  48.         ; Прибраться за собой
  49.         mov     eax,[pAcc]
  50.         mov     eax,[eax]
  51.         stdcall dword [eax+IAccessible.Release],[pAcc]
С помощью функции AccessibleObjectFromWindow получаем интерфейс IAccessible для окна трея. С помощью метода get_accChildCount определяем количество дочерних элементов окна, они же иконки в трее, в том числе и скрытые. С помощью метода get_accName получаем текстовые строки с подсказками для каждого элемента, начиная с 1-го. Нулевому элементу соответствует само окно трея.

Читать статью целиком »
Просмотров: 794 | Комментариев: 7

Отслеживание изменения метки тома

27.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько лет назад я демонстрировал, как можно легко и просто отслеживать изменения в каком-нибудь каталоге. Кроме отслеживания подобных глобальных движений, система позволяет отслеживать изменения более точечно, например, на отдельных объектах файловой системы. Для этого есть функция SHChangeNotifyRegister. В качестве примера я разберу, как можно отслеживать изменение метки тома. На самом деле функция SHChangeNotifyRegister обладает гораздо более широкими возможностями по отслеживанию различных системных уведомлений.

Сперва небольшое количество данных для работы, которые отсутствуют в инклудах FASM.
  1. struct SHChangeNotifyEntry
  2.         pidl       dd ?
  3.         fRecursive dd ?
  4. ends
  5.  
  6. SHCNRF_ShellLevel  = 0x0002
  7. SFGAO_FILESYSTEM   = 0x40000000
  8. SHCNE_RENAMEFOLDER = 0x00020000
Первым делом преобразуем имя отслеживаемого файла, диска или каталога в объект, для этого вызовем функцию SHParseDisplayName. После этого надо заполнить массив отслеживаемых объектов. У нас только один объект - диск C:\, но можно добавить любое их количество.
  1.         ; Настроить отслеживаемый объект
  2.         invoke  SHParseDisplayName,szWatch,NULL,\
  3.                 pidl,SFGAO_FILESYSTEM,NULL
  4.  
  5.         ; Заполнить массив отслеживаемых объектов
  6.         mov     eax,[pidl]
  7.         mov     [shentry.pidl],eax
  8.         mov     [shentry.fRecursive],FALSE
  9.  
  10.         ; Зарегистрировать обработчик уведомлений
  11.         invoke  SHChangeNotifyRegister,\
  12.                 [hwnddlg],\
  13.                 SHCNRF_ShellLevel,\
  14.                 SHCNE_RENAMEFOLDER,\
  15.                 WM_LABEL_CHANGED,\
  16.                 1,\
  17.                 shentry
  18.         mov     [cookie],eax
  19.  
  20.         ; Освободить неиспользуемую память
  21.         invoke  CoTaskMemFree,[pidl]
Так как мы отслеживаем изменение метки тома, а метка тома по сути является разновидностью каталога, то нам достаточно типа уведомления SHCNE_RENAMEFOLDER. Но никто не мешает скомбинировать типы уведомлений для отслеживания или вообще подписаться на все подряд, указав флаг SHCNE_ALLEVENTS.

Код WM_LABEL_CHANGED - это пользовательское сообщение окну приложения, его можно описать, например, как WM_LABEL_CHANGED = WM_USER + 200. При поступлении уведомления от системы именно это сообщение будет отправлено целевому окну обработчика. В параметре lParam находится код события, что очень полезно, когда приложение подписано сразу на несколько событий.

Читать статью целиком »
Просмотров: 767 | Комментариев: 0

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.008 сек.) / Память: 4.5 Mb
Наверх