Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23

MappingFile передача информацию между процессами

30.10.2017, 19:54. Показов 6890. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу осуществить реализацию, где в одном процессе создаем mapping и записываем в него массив, а во втором процессе открываем наш mapping и забираем из него наш массив. Был бы сильно благодарен за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.10.2017, 19:54
Ответы с готовыми решениями:

Передача информации между процессами через MappingFile
Задача такая, реализовать программу копирующую файл, где в одном процессе происходит чтение, а во втором запись, для передачи данных между...

Передача строки символов между процессами с использованием именованных каналов
Нашел пример по теме, но как нужно запускать эти части и произвести передачу данных от одного процесса к трем другим? Серверная часть:...

Обмен данными между процессами
При создании дочернего процесса при помощи функции BOOL CreateProcess ( LPCTSTR lpApplicationName, // имя...

15
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
30.10.2017, 21:58
Я вам уже дал ссылку на то что вам нужно
Передача информации между процессами через MappingFile

Внимательно смотрим что написано в примере
C
1
2
3
4
5
6
7
8
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process."); // !!!! это и есть массив символов.
 
int _tmain()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
30.10.2017, 23:00  [ТС]
ISergey,
пробовал, не получается считать во втором процессе

Добавлено через 47 секунд
ISergey, мне массив из mapping надо записать в файл, вот это не проходит

Добавлено через 32 минуты
ISergey,
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
 
#include "windows.h"
 
 
#include <vector>
#include <stdio.h>
#include <io.h>
 
#include <mutex>
#include <fstream>
#include <thread>
#include <memory.h>
#include <malloc.h>
#include <string.h>
#include "ShellAPI.h"
 
using namespace std;
 
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR* szMsg;
char name[30];
 
char newname[30];
 
int _tmain()
{   
 
 
    setlocale(LC_ALL, "Russian");
    cout << "какой файл копируем" << endl;
    cin >> name;
 
    FILE * ptrFile = fopen(name, "rb");
    if (ptrFile == NULL)
    {
        fputs("Ошибка файла", stderr);
        exit(1);
    }
    fseek(ptrFile, 0, SEEK_END);
    long lSize = ftell(ptrFile);
 
    rewind(ptrFile);
    szMsg = (TCHAR*)malloc(sizeof(TCHAR) * lSize);
    if (szMsg == NULL)
    {
        fputs("Ошибка памяти", stderr);
        exit(2);
    }
    size_t result = fread(szMsg, 1, lSize, ptrFile);
    if (result != lSize)
    {
        fputs("Ошибка чтения", stderr);
        exit(3);
    }
    cout << "Чтение" << endl;
 
 
   HANDLE hMapFile;
   LPCTSTR pBuf;
 
   hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD)
                 szName);                 // name of mapping object
 
   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not create file mapping object (%d).\n"),
             GetLastError());
      return 1;
   }
   pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,
                        0,
                        BUF_SIZE);
 
   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());
 
       CloseHandle(hMapFile);
 
      return 1;
   }
 
 
   CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
    _getch();
 
   UnmapViewOfFile(pBuf);
 
   CloseHandle(hMapFile);
 
   return 0;
}
Добавлено через 1 минуту
ISergey, а вот второй процесс
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
 
#include "windows.h"
 
 
#include <vector>
#include <stdio.h>
#include <io.h>
 
#include <mutex>
#include <fstream>
#include <thread>
#include <memory.h>
#include <malloc.h>
#include <string.h>
#include "ShellAPI.h"
 
using namespace std;
#pragma comment(lib, "user32.lib")
 
#define BUF_SIZE 256
TCHAR szName[] = TEXT("Global\\MyFileMappingObject");
 
int _tmain()
{
    HANDLE hMapFile;
    LPCTSTR pBuf;
 
    hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,   // read/write access
        FALSE,                 // do not inherit the name
        szName);               // name of mapping object
 
    if (hMapFile == NULL)
    {
        _tprintf(TEXT("Could not open file mapping object (%d).\n"),
            GetLastError());
        return 1;
    }
 
    pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
        FILE_MAP_ALL_ACCESS,  // read/write permission
        0,
        0,
        BUF_SIZE);
 
    if (pBuf == NULL)
    {
        _tprintf(TEXT("Could not map view of file (%d).\n"),
            GetLastError());
 
        CloseHandle(hMapFile);
 
        return 1;
    }   
    FILE * ptrFile = fopen("234.txt", "wb");
    Sleep(10000);
    fwrite(pBuf, 1,  BUF_SIZE, ptrFile); // записать в файл содержимое буфера
    cout << "Запись" << endl;
 
    MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
 
    UnmapViewOfFile(pBuf);
 
 
 
    CloseHandle(hMapFile);
 
    return 0;
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
31.10.2017, 10:41
poteytus, я же вам выложил полный код и библиотеку. Неужели не заработала?

Добавлено через 25 минут
Ее отличия от вашей:
1. Я каждый раз создаю файл средствами WinAPI
C
1
HANDLE fd = CreateFile( name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2. Потом этот указатель на файл используется в функции маппинга
C
1
HANDLE fm = CreateFileMapping(fd, NULL, PAGE_READWRITE, 0, size, NULL);
Если я правильно помню, так извращаться пришлось потому что эта функция не понимает строкового имени - ей только HANDLE подавай.
C
1
2
LPCTSTR pBuf;
pBuf = (LPTSTR) MapViewOfFile
А чем обычный указатель (void*, char*) не устроил? И приводить бы не пришлось.
Кроме того, вы не закрываете ptrFile.
Самый простой способ проверить работу с замапленными файлами - открыть в текстовом редакторе, есть там нужная информация или нет.
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
31.10.2017, 14:58  [ТС]
COKPOWEHEU, ваша реализация заработала, спасибо, но проблема в том, что надо createfilemapping, не поможете ошибки в моей реализации исправить?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
31.10.2017, 15:46
Цитата Сообщение от poteytus Посмотреть сообщение
надо createfilemapping
Не понимаю вопроса. Эта функция используется и в моей и в вашей реализации. Что с ней не так?
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
31.10.2017, 18:13  [ТС]
COKPOWEHEU, мне нужна такая реализация как у меня, у вас создаются свои методы, мне же надо без использования библиотек
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
31.10.2017, 18:34
В чем проблема вынести содержимое моих функций в main и порезать настройки доступа?
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
31.10.2017, 19:22  [ТС]
COKPOWEHEU, да пробовал, как-то не особо, я сам на Java пишу, а с c++ только для лаюы этой надо, поэтому такие трудности возникают
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
31.10.2017, 19:42
Ну а хотя бы просто перенести для начала сами функции из memfile.h и объявления из memfile.h в свой main? Добиться работоспособности. Потом постепенно отрезать все ненужное, имена сменить. Впрочем, от функций открытия-закрытия отказываться не стоит: это нарушило бы модульность программы без всяких преимуществ.
На счет вашего кода: что именно не работает, создание файла, запись или чтение?
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
31.10.2017, 21:24  [ТС]
COKPOWEHEU, выбивает ошибка в создании мап файла

Добавлено через 2 минуты
Coul not create file mapping object 5
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
31.10.2017, 22:11
так при чтении или записи? На какой строке?
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
01.11.2017, 15:20  [ТС]
COKPOWEHEU, не создается сам маппинг

Добавлено через 57 секунд
COKPOWEHEU, заходит в if 75 строки первого процесса
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
01.11.2017, 21:27
В общем, я ехал в автобусе, было скучно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
#include <unistd.h>
#include <windows.h>
/* Программа демонстрации отображения файла на память средствами WinAPI
 * Автор COKPOWEHEU
 * Использование: запуск программы с флагом "-w" для записи в файл или с флагом "-r" для чтения. Пример:
 
$ wine a.exe -w
$ wine a.exe -r
 
 * имя отображаемого файла фиксировано, "any_file.txt"
 * размер тоже, 100 байт
 */
 
int main(int argc, char **argv){
  HANDLE fd, fm; //указатели на файл и отображение файла на память (хз зачем Микрософту надо открывать файл дважды
  char *mem; //собственно отображенная память
  int size = 100; //размер (можно было сделвть через параметры командной строки, но мне лень)
  const char filename[] = "any_file.txt"; //имя файла - аналогично
  char wflag; //как работать программе - на чтение или на запись
  //поскольку работа на чтение и запись почти одинаковая, дублировать код мне лень
  //ниже - обработка флаго запуска
  if(argc != 2){
    printf("usage: %s -w / %s -r\n",argv[0], argv[0]);
    return 1;
  }
  if(strcmp(argv[1], "-w")==0){
    wflag = 1;
  }else if(strcmp(argv[1], "-r")==0){
    wflag = 0;
  }else{
    printf("usage: %s -w / %s -r\n",argv[0], argv[0]);
    return 1;
  }
  //теперь - черная магия по созданию файла и его отображению на память
  //как же я "люблю" WinAPI за такие "лаконичные" функции для простейших операций!
  fd = CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                  wflag?OPEN_ALWAYS:OPEN_EXISTING,
                  FILE_ATTRIBUTE_NORMAL, NULL);
  if(fd == INVALID_HANDLE_VALUE || fd == NULL){
    //что-то пошло не так, например, нет прав доступа
    printf("can not %s file '%s'\n",wflag?"create":"open", filename);
    return 1;
  }
  //если файл открывается для записи - убедимся что его размер достаточен
  if(wflag)SetFilePointer(fd, size, NULL, FILE_BEGIN);
  
  fm = CreateFileMapping(fd, NULL, PAGE_READWRITE, 0, size, NULL);
  if(fm == NULL){
    //что может пойти не так здесь без понятия, но проверить надо
    printf("Can not open file for mapping\n");
    CloseHandle(fd);
    return 1;
  }
  //открываем тот же многострадальный файл в третий раз! Зечам - неизвестно, но MS считает что только так и надо
  mem = MapViewOfFile(fm, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, size);
  if(mem == NULL){
    //аналогично предыдущему
    printf("Can not open map\n");
    CloseHandle(fm);
    CloseHandle(fd);
    return 1;
  }
  //то что наверху - инициализация (для сравнения - линуксовая версия заняла бы строк 5, со всеми проверками)
  ///////////////////////////////////////////////////////////////////
  //а то что ниже - пример использования
  for(int i=0; i<1000; i++){
    if(wflag){
      sprintf(mem, "%i\n",i);
      printf("%i / %i\n", i, 1000);
    }else{
      int res;
      sscanf(mem, "%i", &res);
      printf("%i / %i => %i\n", i, 1000, res);
    }
    usleep(10000);
  }
  ///////////////////////////////////////////////////////////////////
  UnmapViewOfFile(mem);
  CloseHandle(fm);
  CloseHandle(fd);
  printf("Success\n");
  return 0;
}
Цитата Сообщение от poteytus Посмотреть сообщение
COKPOWEHEU, заходит в if 75 строки первого процесса
То что я и говорил - сначала файл надо открыть штатными средствами, а потом передать его HANDLE
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
02.11.2017, 01:41  [ТС]
COKPOWEHEU, большое спасибо, а не подскажите где почитать, как размер передавать в консоль, просто надо копировать файл любого размера

Добавлено через 2 минуты
COKPOWEHEU, и ваша реализация не пойдет для работы в двух процеесах, как параметр имени мап файла у вас передается нулл, значит открыть его в другом процессе не получится, а у меня именно в этом и проблема, с нуллом все номрально работает
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
02.11.2017, 12:51
Цитата Сообщение от poteytus Посмотреть сообщение
где почитать, как размер передавать в консоль, просто надо копировать файл любого размера
Параметры argc, argv не устраивают? Как у меня через них передаются флаги "-w", "-r", также можно и размер передавать
Цитата Сообщение от poteytus Посмотреть сообщение
как параметр имени мап файла у вас передается нулл, значит открыть его в другом процессе не получится
Что значит не получится? Вы пробовали эту программу запускать? Один экземпляр создает any_file.txt и пишет в него, второй открывает и читает. Имя файла для отображения задается не в CreateFileMapping(), а в CreateFile(), то есть вам достаточно изменить filename, который у меня задан константой.
Но повторю еще раз: отображение файла на память это не способ межпроцессного взаимодействия, а только альтернативный способ работы с файлами, как fopen/printf/OpenFile и т.п.
Для межпроцессного взаимодействия применяют каналы, разделяемую память, сигналы, сообщения, даже сеть (линуксовый протокол X11 для отображения всей графики работает именно так даже на локальной машине).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2017, 12:51
Помогаю со студенческими работами здесь

Открытие MappingFile
Такая проблема, создаю в одном процессе мап файл с глобальный именем TCHAR szName=TEXT(&quot;Global\MyFileMappingObject&quot;); TCHAR...

Обмен сообщениями между процессами (не потоками одного процесса!!!)
В общем есть несколько процессов (отдельных экзешников). Им необходимо вместе работать. Причем у меня есть свой класс семафора и...

Как лучше передать информацию между двумя процессами?
Суть такая: имеем службу, исполняющую функцию сервера, выполняющую функции архивирования по расписанию. И имеется клиент, который передаёт...

Передача handle между процессами
Есть 1й процесс который создает файл и записывает в него информацию из Edit, после чего создает 2й поток и в качестве параметра передает...

Передача сообщений между процессами
Python 3.4. GUI - WxPython Имеется локальный сервер на Flask. На сервере крутится страничка, которая каждую секунду опрашивает БД....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru