Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2017, 01:54   #1
silentsky
 
Регистрация: 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.
silentsky вне форума Ответить с цитированием
Старый 28.04.2017, 04:25   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Возможно...в принципе, так люди код и пишут - объединяют много "программ" в одну, т.к. велосипеды все давно придуманы. Из двух кодов делаете 1 комбинированый и получаете 1 программу.
Если вам реально нада 2 раздельные программы - так будет труднее, но все равно - можно.
alexzk вне форума Ответить с цитированием
Старый 28.04.2017, 04:40   #3
silentsky
 
Регистрация: 28.04.2017
Сообщений: 4
По умолчанию

Для тех кто изобрел двухколесный велосипед, изобрести трехколесный было бы не трудно
silentsky вне форума Ответить с цитированием
Старый 28.04.2017, 05:59   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от silentsky Посмотреть сообщение
Для тех кто изобрел двухколесный велосипед, изобрести трехколесный было бы не трудно
У вас typedef std::vector <myObject> Vec;

нельзя тупо взять на него указатель и скопировать, вы копируете обертку, потому что вектор в себе хранить указатели на ваши myObject. Там дальше вы копируете обертку, т.е. указатели, которые во 2 программе не верны.
Для кросс-программного копирования НЕЛЬЗЯ тупо копировать объекты, внутри которых есть ссылки или указатели. Каждый такой указатель нада скопировать отдельно. Это ж самое касается сохранения на диск в файл, передачи по сети и т.д.
alexzk вне форума Ответить с цитированием
Старый 28.04.2017, 19:57   #5
silentsky
 
Регистрация: 28.04.2017
Сообщений: 4
По умолчанию

Спасибо, теперь начинает проясняться. Если убрать std::vector и всё что включает указатели, то получится (уже получялось с массивом типа double).. Тогда как в функции CopyMemory правильно указать размер передаваемых данных в байтах, и размер буфера, если количество объектов не известно.. Было бы идеально, чтобы у обеих программ было общее адресное пространство, тогда небыло бы этих сложностей, с указателями и функциями копирования..
silentsky вне форума Ответить с цитированием
Старый 28.04.2017, 21:05   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от silentsky Посмотреть сообщение
Спасибо, теперь начинает проясняться. Если убрать std::vector и всё что включает указатели, то получится (уже получялось с массивом типа double).. Тогда как в функции CopyMemory правильно указать размер передаваемых данных в байтах, и размер буфера, если количество объектов не известно.. Было бы идеально, чтобы у обеих программ было общее адресное пространство, тогда небыло бы этих сложностей, с указателями и функциями копирования..
Такие сложности возникают много когда, например при работе через сеть ...и давно решаются, называется это "сериализация " в "буфер" в вашем случае. В самом простецком варианте пишите 4 байта размер массива, затем сам массив, читать так же.

Если вы задумали, что-то сложнее учебных тестов, рекомендую Google Protobuf, одно из лучших решений для сериализации - очень быстрое, с контролем всего, и т.д. Там свой язык, на котором описываете данные, подлежащие сериализации. Дальше, запуском protoc генерируется cpp/h файлы, которые добавляются в ваш проект в обе проги. Там будет уже класс, которые содержит указанные поля, и умеет самозаписыватся и самочитатся просто в буфер (указатель).
alexzk вне форума Ответить с цитированием
Старый 04.05.2017, 18:25   #7
silentsky
 
Регистрация: 28.04.2017
Сообщений: 4
По умолчанию

Спасибо (еще раз) за подсказку. Думал что нашел обходной путь, но оказалось что тоже работает не так как надо (передать данные можно, а синхронизировать обработку этих данных в обеих программах не получается) Сложнее учебных тестов, буду пробовать Google Protobuf, похоже что это то что надо! Спасиб!
silentsky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интеграция данных между двумя ИС 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