При запуске скрипта проверяется сколько копий программы уже открыто. В данном примере запустится 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);
} |