Грубо говоря обмен данными происходит через общую(разделяемую) память в виртуальном адресном пространстве
Сначала запустить "Сервер", затем "Клиент"(Python или Kibor, можно оба). Нажать старт на "Сервере"
Cервер Kibor, "записывает" в виртуальную память данные (Отобразить)
CODE:
#define FORMAT_MESSAGE_FROM_SYSTEM 4096
#define FORMAT_MESSAGE_IGNORE_INSERTS 512
#define PAGE_READWRITE 4
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define FALSE 0
#define NULL 0
#define INVALID_HANDLE_VALUE -1
external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll" );
external(INT, "FormatMessage", "FormatMessageA", "kernel32.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll" );
external(INT, "OpenFileMapping", "OpenFileMappingA", "Kernel32.dll" );
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll" );
external(INT, "GetLastError", "GetLastError", "Kernel32.dll" );
string mappingname = "EventName";//Имя "отображаемого" объекта.
new char Buf[256];
string send_data = "Message from first process.";
strcpy(#Buf[0], send_data);
int hFileMapping;
int lpFileMap;
//Создание именованного объекта файлового отображения, возвращает дескриптор объекта.
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, mappingname);
if(hFileMapping==0)
{
error_text("Ошибка CreateFileMapping: ");
goto end;
}
//Получение начального адреса(указателя) на отображенную область памяти.
lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap==0)
{
error_text("Ошибка MapViewOfFile: ");
goto end;
}
send();
messagebox("Старт");
delete Buf;
new char Buf[256];
//Цикл "передает" данные ~100 раз за секунду
int b=0;
for (int a=-1; a<100; a++)
{
sleep(10);
send_data = format(b);
strcpy(#Buf[0], send_data);
send();
b++;
}
messagebox("Передача окончена");
//Копирование содержимого блока памяти "address(#Buf[0])" в целевой блок памяти "lpFileMap"
function send()
{
RtlMoveMemory(lpFileMap, address(#Buf[0]), sizearray(Buf));
}
function error_text(string er_text)
{
int error=GetLastError();
char message[999];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, address(#message[0]), sizearray(message), 0);
messagebox(er_text+format(#message[0])+"("+ format(error)+")");
}
end:
/////////////////////////////////////////////////////////////////
if(UnmapViewOfFile(lpFileMap)!=1)//Отменяет отображение.
{
error_text("Ошибка UnmapViewOfFile: ");
}
if(CloseHandle(hFileMapping)!=1)//Закрывает дескриптор созданного объекта.
{
error_text("Ошибка CloseHandle: ");
}
//////////////////////////////////////////////////////////////////
#define FORMAT_MESSAGE_FROM_SYSTEM 4096
#define FORMAT_MESSAGE_IGNORE_INSERTS 512
#define PAGE_READWRITE 4
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define FALSE 0
#define NULL 0
#define INVALID_HANDLE_VALUE -1
external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll" );
external(INT, "FormatMessage", "FormatMessageA", "kernel32.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll" );
external(INT, "OpenFileMapping", "OpenFileMappingA", "Kernel32.dll" );
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll" );
external(INT, "GetLastError", "GetLastError", "Kernel32.dll" );
string mappingname = "EventName";//Имя "отображаемого" объекта.
new char Buf[256];
string send_data = "Message from first process.";
strcpy(#Buf[0], send_data);
int hFileMapping;
int lpFileMap;
//Создание именованного объекта файлового отображения, возвращает дескриптор объекта.
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 256, mappingname);
if(hFileMapping==0)
{
error_text("Ошибка CreateFileMapping: ");
goto end;
}
//Получение начального адреса(указателя) на отображенную область памяти.
lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap==0)
{
error_text("Ошибка MapViewOfFile: ");
goto end;
}
send();
messagebox("Старт");
delete Buf;
new char Buf[256];
//Цикл "передает" данные ~100 раз за секунду
int b=0;
for (int a=-1; a<100; a++)
{
sleep(10);
send_data = format(b);
strcpy(#Buf[0], send_data);
send();
b++;
}
messagebox("Передача окончена");
//Копирование содержимого блока памяти "address(#Buf[0])" в целевой блок памяти "lpFileMap"
function send()
{
RtlMoveMemory(lpFileMap, address(#Buf[0]), sizearray(Buf));
}
function error_text(string er_text)
{
int error=GetLastError();
char message[999];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, address(#message[0]), sizearray(message), 0);
messagebox(er_text+format(#message[0])+"("+ format(error)+")");
}
end:
/////////////////////////////////////////////////////////////////
if(UnmapViewOfFile(lpFileMap)!=1)//Отменяет отображение.
{
error_text("Ошибка UnmapViewOfFile: ");
}
if(CloseHandle(hFileMapping)!=1)//Закрывает дескриптор созданного объекта.
{
error_text("Ошибка CloseHandle: ");
}
//////////////////////////////////////////////////////////////////
Kлиент Python, "читает" с виртуальной памяти данные(ссылка) (Отобразить)
(для просмотра ссылки Вам необходимо авторизоваться)
P.s. (Отобразить)
Параметр dwMaximumSizeHigh менять не стоит!, 0 - для объектов отображения до 4.294 GB:
HANDLE CreateFileMappingA(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh, //Старшее двойное слово (DWORD) максимального размера объекта "проецируемый файл".
DWORD dwMaximumSizeLow,
LPCSTR lpName
);
Параметр dwMaximumSizeHigh менять не стоит!, 0 - для объектов отображения до 4.294 GB:
Цитата:
HANDLE CreateFileMappingA(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh, //Старшее двойное слово (DWORD) максимального размера объекта "проецируемый файл".
DWORD dwMaximumSizeLow,
LPCSTR lpName
);
(Добавление)
Клиент Kibor (Отобразить)
CODE:
#define FORMAT_MESSAGE_FROM_SYSTEM 4096
#define FORMAT_MESSAGE_IGNORE_INSERTS 512
#define PAGE_READWRITE 4
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define FALSE 0
#define NULL 0
#define INVALID_HANDLE_VALUE -1
external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll" );
external(INT, "FormatMessage", "FormatMessageA", "kernel32.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll" );
external(INT, "OpenFileMapping", "OpenFileMappingA", "Kernel32.dll" );
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll" );
external(INT, "GetLastError", "GetLastError", "Kernel32.dll" );
string mappingname = "EventName";//Имя "отображаемого" объекта.
char Buf[256];
string get_data = "Message from first process.";
int hFileMapping2;
int lpFileMap2;
//Открытие именованного объекта файлового отображения, возвращает дескриптор объекта.
hFileMapping2 = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mappingname);
if(hFileMapping2==0)
{
error_text("Ошибка OpenFileMapping: ");
goto end;
}
//Получение начального адреса(указателя) на отображенную область памяти.
lpFileMap2 = MapViewOfFile(hFileMapping2, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap2==0)
{
error_text("Ошибка MapViewOfFile: ");
goto end;
}
get();
textout(0, 500, 500, format(#Buf[0]), 0);
while(format(#Buf[0])==get_data)
{
sleep(1);
get();
textout(0, 500, 500, format(#Buf[0]), 0);
}
resettextout(1);
looptime(1500)
{
sleep(10);
get();
textout(1, 500, 500, format(#Buf[0]), 0);
if(format(#Buf[0])=="100"){break;}
}
messagebox("Прием окончен");
//Копирование содержимого блока памяти "lpFileMap" в целевой блок памяти "address(#Buf[0])"
function get()
{
RtlMoveMemory(address(#Buf[0]), lpFileMap2, 256);
}
function error_text(string er_text)
{
int error=GetLastError();
char message[999];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, address(#message[0]), sizearray(message), 0);
messagebox(er_text+format(#message[0])+"("+ format(error)+")");
}
end:
/////////////////////////////////////////////////////////////////
if(UnmapViewOfFile(lpFileMap2)!=1)//Отменяет отображение.
{
error_text("Ошибка UnmapViewOfFile: ");
}
if(CloseHandle(hFileMapping2)!=1)//Закрывает дескриптор созданного объекта.
{
error_text("Ошибка CloseHandle: ");
}
//////////////////////////////////////////////////////////////////
#define FORMAT_MESSAGE_FROM_SYSTEM 4096
#define FORMAT_MESSAGE_IGNORE_INSERTS 512
#define PAGE_READWRITE 4
#define FILE_MAP_READ 4
#define FILE_MAP_WRITE 2
#define FALSE 0
#define NULL 0
#define INVALID_HANDLE_VALUE -1
external(VOID, "RtlMoveMemory", "RtlMoveMemory", "Ntdll.dll" );
external(INT, "FormatMessage", "FormatMessageA", "kernel32.dll");
external(INT, "CreateFileMapping", "CreateFileMappingA", "Kernel32.dll" );
external(INT, "OpenFileMapping", "OpenFileMappingA", "Kernel32.dll" );
external(INT, "MapViewOfFile", "MapViewOfFile", "Kernel32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "UnmapViewOfFile", "UnmapViewOfFile", "Kernel32.dll" );
external(INT, "GetLastError", "GetLastError", "Kernel32.dll" );
string mappingname = "EventName";//Имя "отображаемого" объекта.
char Buf[256];
string get_data = "Message from first process.";
int hFileMapping2;
int lpFileMap2;
//Открытие именованного объекта файлового отображения, возвращает дескриптор объекта.
hFileMapping2 = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mappingname);
if(hFileMapping2==0)
{
error_text("Ошибка OpenFileMapping: ");
goto end;
}
//Получение начального адреса(указателя) на отображенную область памяти.
lpFileMap2 = MapViewOfFile(hFileMapping2, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if(lpFileMap2==0)
{
error_text("Ошибка MapViewOfFile: ");
goto end;
}
get();
textout(0, 500, 500, format(#Buf[0]), 0);
while(format(#Buf[0])==get_data)
{
sleep(1);
get();
textout(0, 500, 500, format(#Buf[0]), 0);
}
resettextout(1);
looptime(1500)
{
sleep(10);
get();
textout(1, 500, 500, format(#Buf[0]), 0);
if(format(#Buf[0])=="100"){break;}
}
messagebox("Прием окончен");
//Копирование содержимого блока памяти "lpFileMap" в целевой блок памяти "address(#Buf[0])"
function get()
{
RtlMoveMemory(address(#Buf[0]), lpFileMap2, 256);
}
function error_text(string er_text)
{
int error=GetLastError();
char message[999];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, address(#message[0]), sizearray(message), 0);
messagebox(er_text+format(#message[0])+"("+ format(error)+")");
}
end:
/////////////////////////////////////////////////////////////////
if(UnmapViewOfFile(lpFileMap2)!=1)//Отменяет отображение.
{
error_text("Ошибка UnmapViewOfFile: ");
}
if(CloseHandle(hFileMapping2)!=1)//Закрывает дескриптор созданного объекта.
{
error_text("Ошибка CloseHandle: ");
}
//////////////////////////////////////////////////////////////////