Blog. Just Blog

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

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

Запуск ограниченного количества копий программы

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

Первый способ использует shared-память, общую для всех копий данного приложения. В ней находится счетчик, который каждая копия увеличивает на 1 при запуске и уменьшает на 1 при завершении своей работы. При старте выполняется проверка на количество ранее запущенных копий. Счетчик достиг максимального значения - пожалуйте на выход.
  1. ; Расшаренная секция, общая для всех копий данного приложения
  2. section '.shared' data readable writeable shareable
  3. started  dd  0       ; Количество запущенных копий
  4.  
  5. ; Сегмент кода
  6. section '.code' code readable executable 
  7.         cmp     [started],3     ; Уже запущено три экземпляра программы?
  8.         jae     already_started ; Да, на выход
  9.  
  10.         ; +1 к счетчику копий
  11.         ; Префикс LOCK используется для предотвращения возможных конфликтов
  12.         ; на многопроцессорных машинах
  13.         lock add [started],1
  14.  
  15.         ; Нормальный запуск программы 
  16.         ... 
  17.         ...
  18.         ...
  19.         ; -1 от счетчика копий
  20.         lock sub [started],1
  21.         jmp     loc_exit
  22.  
  23. already_started:
  24.         ; Выход из программы
  25.         ...
  26. loc_exit:
Обратите внимание на использование префикса LOCK перед командами изменения счетчика копий. Этот префикс предназначен для обеспечения исключительного доступа к ячейке памяти на время выполнения команды при работе на многопроцессорных многозадачных системах. В отличие от проверки единственной копии, у такого варианта решения есть большой недостаток. Если приложение завершится аварийно или будет принудительно завершено системой, то счетчик работающих копий не уменьшится. Обойти это можно, если, например, в общей памяти хранить не просто счетчик, а массив идентификаторов процессов, при каждом запуске проверяя их наличие и актуальность.

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

Выпадающий список (Combobox) с динамическим поиском

17.05.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем усовершенствовать элемент Combobox. Создавать его мы научились, красивыми иконками снабдили, теперь давайте добавим полнотекстовый поиск по списку и фильтрацию. Справедливости ради стоит отметить, что зачаточный вариант поиска в комбобоксе все-таки присутствует. Если ввести какую-нибудь строку, а затем открыть выпадающий список, то курсор будет установлен на первом найденном пункте списка, который начинается с введенной строки. Я же хочу сделать так, чтобы в списке оставались только те пункты, в которых присутствует введенная строка, причем не только в начале, а вообще. Например, если я введу "Jo", то в списке должны остаться как "John Smith", так и "Patrick Joel".

Изменения поля ввода будем отлавливать штатными средствами в обработчике комбобокса. Это должно быть уведомление CBN_EDITUPDATE. После этого сохраняем введенную строку в сухом прохладном месте, очищаем список, а затем заполняем его, но уже только теми пунктами, где присутствует введенная строка.
  1.         cmp     [msg],WM_COMMAND
  2.         je      wmcommand
  3.         ...
  4.         ...
  5. wmcommand:
  6.         cmp     [wparam], CBN_EDITUPDATE shl 16 + ID_LIST
  7.         je      combobox_filter
Тут я использовал обработчик главного окна, но никто не запрещает воспользоваться субклассированием, а то и вовсе нарисовать какой-нибудь универсальный модуль для работы с комбобоксами.

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

32-bit ASM Calculator 1.10

26.04.2020 | Категория: Мои программы | Автор: ManHunter

Скриншот программы 32-bit ASM Calculator

32-битный калькулятор, написан как обычно для личных нужд, потому что "ксорить дворды в уме" уже поднадоело :) Позволяет выполнять арифметические и битовые команды Ассемблера, в том числе команды, использующие при вычислениях значение Carry Flag. Результат операции отображается в шестнадцатеричном виде с возможностью реверса байт, в десятичном виде с возможностью знакового отображения, в бинарном с разбивкой на октеты и в текстовом, если есть такая возможность. Кроме этого калькулятор показывает состояние флагов процессора сразу после выполнения выбранной операции и условные переходы, которые сработают при этой комбинации флагов. Состоянием флагов можно также управлять и вручную. Встроенный конвертер позволяет быстро переводить числа из десятичной, шестнадцатеричной, двоичной систем счисления, текстовых строк и битового представления. Вы можете сразу устанавливать полученное число в качестве значений операндов.

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

Как защитить приложение от снятия скриншота

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

Как защитить приложение от снятия скриншота

Про ценность информации в современном цифровом мире можно рассказывать долго, но я этого делать не буду. Только хочу упомянуть такую безобидную на первый взгляд штуку, как скриншот экрана. "Алло, техподдержка, у меня тут программа что-то пишет непонятно" - "Пришлите скриншот". Тык в PrintScreen, вставить в письмо, отправить. Знакомая ситуация? А то, что в это время на экране может быть служебная или вовсе конфиденциальная информация, и куда она пойдет дальше, об этом мало кто думает. Если данные, отображаемые в окнах приложения, даже случайно не должны быть переданы не по назначению, то разработчикам софта стоит об этом позаботиться. На скриншоте как раз пример скриншота окна с защитой от скриншота (извините). Само окно есть, но его содержимое не отображается.

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

Управление кнопками Minimize, Maximize, Help и Close в заголовке окна

15.04.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная развлекуха на Ассемблере. Сегодня мы будем всячески управлять стандартными кнопками в заголовке окна. Это могут быть Minimize, Maximize, Help и Close, для каждой из них свои правила. Для начала, чтобы в заголовке окна появились кнопки, оно должно быть создано со стилями WS_CAPTION и WS_SYSMENU, этого достаточно, чтобы появилась кнопка Close. Кнопки Minimize и Maximize появляются при добавлении в стили окна хотя бы одного значения WS_MAXIMIZEBOX или WS_MINIMIZEBOX, причем они неразрывны как Ленин и Партия, в любом случае появятся обе, а комбинацией стилей только регулируется их активность. Для появления кнопки Help в расширенном стиле окна должно присутствовать значение WS_EX_CONTEXTHELP, причем кнопки Minimize/Maximize и кнопка Help взаимоисключающие, одновременно в заголовке окна они присутствовать не могут. Почему так сделано - непонятно.

С теорией закончили, переходим к практике. В различных ситуациях может понадобиться отключение или включение определенных кнопок в заголовке окна. Как несложно догадаться, состояния кнопок Minimize, Maximize и Help регулируются манипуляциями со стилями окна:
  1. .enable_min:
  2.         ; Активировать кнопку Minimize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         or      eax,WS_MINIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .disable_min:
  2.         ; Отключить кнопку Minimize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not WS_MINIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .enable_max:
  2.         ; Активировать кнопку Maximize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         or      eax,WS_MAXIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
  1. .disable_max:
  2.         ; Отключить кнопку Maximize
  3.         invoke  GetWindowLong,[hwnddlg],GWL_STYLE
  4.         and     eax,not WS_MAXIMIZEBOX
  5.         invoke  SetWindowLong,[hwnddlg],GWL_STYLE,eax
Если уж делать совсем все правильно, то было бы неплохо при активации одной из кнопок Minimize или Maximize на всякий случай удалять из расширенного стиля окна взаимоисключающее значение WS_EX_CONTEXTHELP. Также имейте в виду, что при одновременном отключении обеих кнопок, они просто исчезнут.

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

01 ... 09 10 11 12 13 14 15 ... 51
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.15 сек. / MySQL: 3 (0.0666 сек.) / Память: 4.75 Mb
Наверх