Вирус - бесплатно распространяемая программа, которая, впрочем, ничего и не делает. Потому и бесплатно.
program Previns;
uses
WinTypes,
WinProcs,
SysUtils,
Forms,
Uprevins in 'UPREVINS.PAS' {Form1};
{$R *.RES}type
PHWND = ^HWND;
function EnumFunc(Wnd: HWND; TargetWindow: PHWND): bool; export;
var
ClassName: array[0..30] of char;
begin
Result := true;
if GetWindowWord(Wnd, GWW_HINSTANCE) = hPrevInst thenbegin
GetClassName(Wnd, ClassName, 30);
if StrIComp(ClassName, 'TApplication') = 0 thenbegin
TargetWindow^ := Wnd;
Result := false;
end;
end;
end;
procedure GotoPreviousInstance;
var
PrevInstWnd: HWND;
begin
PrevInstWnd := 0;
EnumWindows(@EnumFunc, Longint(@PrevInstWnd));
if PrevInstWnd <> 0 thenif IsIconic(PrevInstWnd) then
ShowWindow(PrevInstWnd, SW_RESTORE)
else
BringWindowToTop(PrevInstWnd);
end;
beginif hPrevInst <> 0 then
GotoPreviousInstance
elsebegin
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
Программа на Delphi, предназначенная для предотвращения запуска нескольких экземпляров одного приложения. Вот как она работает:
Программа определяет функцию EnumFunc, которая перечисляет все окна на системе и проверяет, есть ли среди них окно с тем же handle инстанции (hPrevInst) как текущий процесс. Если такое окно найдено, функция устанавливает указатель TargetWindow в указывающий на это окно.
Главная процедура GotoPreviousInstance вызывает EnumWindows с callback-функцией @EnumFunc и параметром Longint(@PrevInstWnd). Это перечисляет все окна на системе и находит то, которое соответствует handle инстанции текущего процесса.
Если найденное окно является иконическим (т. е., уменьшенным), программа восстанавливает его до оригинального размера с помощью ShowWindow(SW_RESTORE). Если окно не иконическое, она выводит его на передний план в порядке z-значения с помощью BringWindowToTop.
Если не найдено соответствующего окна (т. е., это первый экземпляр), программа создает новый форм (TForm1) и запускает приложение с помощью Application.Run.
В контексте вируса поведение программы заключается в том, что она может обнаружить и запустить существующий экземпляр самой себя, эффективно предотвращая пользователя от запуска нескольких копий одного программного обеспечения.
Некоторые предложения по улучшению:
Вместо использования жестко закодированного handle инстанции (hPrevInst) рассмотрите возможность хранения его в файле конфигурации или настройке реестра, чтобы можно было легко изменить.
Рассмотрите добавление дополнительных проверок для уверенности в том, что обнаруженное окно является экземпляром самого себя, а не просто любым окном с тем же handle инстанции.
Если вы обеспокоены безопасностью, рассмотрите использование более надежных методов обнаружения и взаимодействия с существующими экземплярами, таких как механизмы межпроцессного общения (IPC), такие как названные трубы или сокеты.
В целом, программа демонстрирует основной подход к предотвращению запуска нескольких экземпляров приложения. Однако она может потребовать дополнительных функций и функциональности для ее более надежной и безопасной работы в реальных сценариях.
В статье описывается способ создания программы на языке Delphi, которая не позволяет запускать вторую копию программы, и предотвращает распространение вирусов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.