|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.04.2017, 01:54 | #1 |
Регистрация: 28.04.2017
Сообщений: 4
|
Две программы как одно целое. Классы и std::vector в функции CopyMemory
Возможно ли передать данные динамического масcива std:vector из одной программы в другую функцией CopyMemory? Так чтобы вторая программа видела и имела доступ к классам и обьектам первой программы. pBuf второй программы показывает размер массива "size 3", но данные обьектов внутри массива пустые, пишет "Unable to read memory".
1 прграмма: #include <windows.h> #include <stdio.h> #include <conio.h> #include <tchar.h> #include "myObject.h" #define BUF_SIZE 256 TCHAR szName[] = TEXT("Global\\MyFileMappingObject") ; typedef std::vector <myObject> Vec; INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd) { HANDLE hMapFile; Vec *pBuf; Vec pA; Vec * pntrA; myObject pB; myObject pC; myObject pD; 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 pBuf = (Vec*)MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); pC.data[0] = 0.11141112; pA.push_back(pC); pA.push_back(pB); pA.push_back(pD); pntrA = &pA; CopyMemory((PVOID)pBuf, pntrA, 256); _getch(); return 0; } 2 прграмма: #include <windows.h> #include <stdio.h> #include <conio.h> #include <tchar.h> #include "myObject.h" #pragma comment(lib, "user32.lib") #define BUF_SIZE 256 TCHAR szName[] = TEXT("Global\\MyFileMappingObject") ; typedef std::vector <myObject> Vec; INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd) { HANDLE hMapFile; Vec *pBuf; hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, // read/write access FALSE, // do not inherit the name szName); // name of mapping object pBuf = (Vec*)MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); return 0; } Последний раз редактировалось silentsky; 28.04.2017 в 03:33. |
28.04.2017, 04:25 | #2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Возможно...в принципе, так люди код и пишут - объединяют много "программ" в одну, т.к. велосипеды все давно придуманы. Из двух кодов делаете 1 комбинированый и получаете 1 программу.
Если вам реально нада 2 раздельные программы - так будет труднее, но все равно - можно. |
28.04.2017, 04:40 | #3 |
Регистрация: 28.04.2017
Сообщений: 4
|
Для тех кто изобрел двухколесный велосипед, изобрести трехколесный было бы не трудно
|
28.04.2017, 05:59 | #4 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
нельзя тупо взять на него указатель и скопировать, вы копируете обертку, потому что вектор в себе хранить указатели на ваши myObject. Там дальше вы копируете обертку, т.е. указатели, которые во 2 программе не верны. Для кросс-программного копирования НЕЛЬЗЯ тупо копировать объекты, внутри которых есть ссылки или указатели. Каждый такой указатель нада скопировать отдельно. Это ж самое касается сохранения на диск в файл, передачи по сети и т.д. |
|
28.04.2017, 19:57 | #5 |
Регистрация: 28.04.2017
Сообщений: 4
|
Спасибо, теперь начинает проясняться. Если убрать std::vector и всё что включает указатели, то получится (уже получялось с массивом типа double).. Тогда как в функции CopyMemory правильно указать размер передаваемых данных в байтах, и размер буфера, если количество объектов не известно.. Было бы идеально, чтобы у обеих программ было общее адресное пространство, тогда небыло бы этих сложностей, с указателями и функциями копирования..
|
28.04.2017, 21:05 | #6 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Если вы задумали, что-то сложнее учебных тестов, рекомендую Google Protobuf, одно из лучших решений для сериализации - очень быстрое, с контролем всего, и т.д. Там свой язык, на котором описываете данные, подлежащие сериализации. Дальше, запуском protoc генерируется cpp/h файлы, которые добавляются в ваш проект в обе проги. Там будет уже класс, которые содержит указанные поля, и умеет самозаписыватся и самочитатся просто в буфер (указатель). |
|
04.05.2017, 18:25 | #7 |
Регистрация: 28.04.2017
Сообщений: 4
|
Спасибо (еще раз) за подсказку. Думал что нашел обходной путь, но оказалось что тоже работает не так как надо (передать данные можно, а синхронизировать обработку этих данных в обеих программах не получается) Сложнее учебных тестов, буду пробовать Google Protobuf, похоже что это то что надо! Спасиб!
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Интеграция данных между двумя ИС | Alexbmgn | Помощь студентам | 9 | 27.11.2014 10:58 |
, передачу данных между двумя процессами | Oyoume | Помощь студентам | 0 | 29.11.2012 00:58 |
Импорт (перенос) данных между двумя базами | reihtmonbern | Помощь студентам | 1 | 11.11.2011 13:24 |
Бот для передачи данных между сайтами | Conq | PHP | 6 | 03.10.2011 23:34 |
Предача и чтение данных между двумя COM портами | Linore | Общие вопросы .NET | 10 | 22.01.2010 11:47 |