Кибор » Кибор - Интегрированная среда разработки ботов » Готовые скрипты » Запуск ограниченного числа копий программы

Страниц (1): [1]
 

1. Zireael - 06 Мая, 2023 - 06:01:56 - перейти к сообщению
При запуске скрипта проверяется сколько копий программы уже открыто. В данном примере запустится 3 копии программы, при запуске 4-й будет сообщение что запущено максимальное количество копий.
CODE:
#define NULL 0
#define PAGE_READWRITE 0x04
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define INVALID_HANDLE_VALUE -1

external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll");
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll");
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll");


options ("stop", "C");
char Buf[99];
int SizeBuf = sizearray(Buf);
int FileMapping, FileMap;

// проверка на количество копий
// в функцию передаём сколько копий программы можно запустить
// в данном примере можно запустить 3 exe
if(Start(3)<1)
{
messagebox("Уже открыто максимальное количество копий программы");
goto end; // можно использовать close(); чтобы закрыть программу
}
//////

createdialog(0);
showdialog(0, "Dialog",100, 100, 300, 300, 4, 1);
loop()sleep(10);
end:;




function getmessage(0, WM_CLOSE)
{
string Text = Read();
Write(format(formatsn(Text)-1));
ReleaseResource();
goto global end;
}

function Start(int Count)
{
FileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SizeBuf, "MyKibFileName");
if(FileMapping==NULL)
{
messagebox("Error CreateFileMapping");
return -1;
}
FileMap = MapViewOfFile(FileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(FileMap==NULL)
{
messagebox("Error MapViewOfFile");
return -2;
}

string Text = Read();
if(Text=="")Write("1");
else
{
if(formatsn(Text) < Count)Write(format(formatsn(Text)+1));
else return -3;
}
return 1;
}

function Write(string Message)
{
strcpy(#Buf[0], Message);
RtlMoveMemory(FileMap, address(#Buf[0]), SizeBuf);
}

function Read()
{
RtlMoveMemory(address(#Buf[0]), FileMap, SizeBuf);
return format(#Buf[0]);
}

function ReleaseResource()
{
if(FileMap != NULL) UnmapViewOfFile(FileMap);
if(FileMapping != NULL) CloseHandle(FileMapping);
}
2. asterka - 21 Мая, 2023 - 07:41:28 - перейти к сообщению
Zireael , Спасибо за скрипт!. Есть вопрос. Как расширить это ограничение на другие запущенные учётные записи Windows? Я запустил две учётки. И на обеих могу запустить по три экземпляра.
3. Zireael - 21 Мая, 2023 - 07:53:23 - перейти к сообщению
 Цитата:
Как расширить это ограничение на другие запущенные учётные записи Windows?

Добавить Global\ перед именем файла.
 Цитата:
FileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SizeBuf, "Global\MyKibFileName" );

Powered by ExBB FM 1.0 Final