edx Опубликовано 10 декабря, 2020 Поделиться Опубликовано 10 декабря, 2020 (изменено) Всем здравствуйте. Я уже как-то затрагивал эту тему, но вскользь (там было про пайпы, чтение\запись памяти, shared sections и прочее) и я так толком и не нашел ответа. Суть вот в чем, есть GUI в виде exe-шника, написанного в VS 2019 с использованием конструктора и есть dll, которая загружается в процесс. Необходимо организовать обмен данными между dll и exe. Я в этом не сильно шарю..) Но пока что я остановился на OpenFileMapping по которым передаются структуры с данными. Порядок действий: Создаю одинаковые структуры там и там, к примеру: struct sysMessages { BOOL dllStatus = 0; BOOL update = 0; char* msg; }; struct userInfo { int User[50]; int Count; }; typedef struct { sysMessages messages; userInfo info; }BufferStruct, * pBufferStruct; pBufferStruct buf; И далее файл мэппинг: В DLL DataMapping = OpenFileMappingW(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, L"Local\\gui.datamap"); ActionsMapping = OpenFileMappingW(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, L"Local\\gui.actmap"); Actions = (pActions*)MapViewOfFile(ActionsMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); buf = (BufferStruct*)MapViewOfFile(DataMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); В GUI DataMapping = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(buf), L"Local\\gui.datamap"); ActionsMapping = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(buf), L"Local\\gui.actmap"); Actions = (pActions*)MapViewOfFile(ActionsMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); buf = (BufferStruct*)MapViewOfFile(DataMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); И дальше просто пишу\читаю из структуры buf и Actoins. Тут возникло несколько вопросов: 1. Сколько хэндлов(если можно так сказать) файл маппинга можно открывать и как это скажется на скорости работы? 2. Не произойдет ли конфликта, если gui и dll одновременно будут писать/читать в/из структуру(ы)? Да, мне писали про согласование чтения\записи, но что будет если просто забить на это? 3. Если dll будет только писать в структуру, а gui только читать из нее, нужно ли думать о согласовании? 4. Есть ли какой-то мануал\статья по сокетам? По сути мне - нужно изменять значение переменных там и там. Еще где-то мельком видел инфу про создание внешних интерфейсов в dll и exe, но без каких-либо примеров. Изменено 10 декабря, 2020 пользователем edx Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 10 декабря, 2020 Поделиться Опубликовано 10 декабря, 2020 13 минут назад, edx сказал: Необходимо организовать обмен данными между dll и exe. В чём вопрос? Если тебе нужно организовать ipc, ты просто выбираешь подходящий тебе метод и реализуешь его. Также, ты можешь просто перенести контекст чужого процесса в свой контекст и работать с этим. Ссылка на комментарий Поделиться на другие сайты Поделиться
edx Опубликовано 10 декабря, 2020 Автор Поделиться Опубликовано 10 декабря, 2020 1 час назад, JustHack сказал: В чём вопрос? Если тебе нужно организовать ipc, ты просто выбираешь подходящий тебе метод и реализуешь его. Также, ты можешь просто перенести контекст чужого процесса в свой контекст и работать с этим. Ну, собственно вопросы пронумерованы в самом низу, многобукв что ли? Или мне предисловие убрать?) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 декабря, 2020 Поделиться Опубликовано 11 декабря, 2020 Можно из базуки по воробьям палить. И где-то это даже получится сделать. Но зачем? Есть именованные пайпы, юзай их, это самый удобный способ. А чтобы кидаться структурами можно заюзать те же протобуферы. По твоим вопросам: 13 часов назад, edx сказал: 1. Сколько хэндлов(если можно так сказать) файл маппинга можно открывать и как это скажется на скорости работы? Можешь даже не думать об этом. Сами хендлы занимают мало места в памяти, и влиять на скорость практически не будут 13 часов назад, edx сказал: 2. Не произойдет ли конфликта, если gui и dll одновременно будут писать/читать в/из структуру(ы)? Да, мне писали про согласование чтения\записи, но что будет если просто забить на это? Если одновременно читать разными маркерами - проблем не будет. При одновременной записи - будет. Без согласования ты получишь либо кашу из данных, либо эксепшн. 13 часов назад, edx сказал: 3. Если dll будет только писать в структуру, а gui только читать из нее, нужно ли думать о согласовании? Если хочешь при чтении получать консистентные данные, то да, нужно. Если нет, то можно забить. Подозреваю, что тебе таки хотелось бы при чтении получать консистентные данные. 13 часов назад, edx сказал: 4. Есть ли какой-то мануал\статья по сокетам? По сути мне - нужно изменять значение переменных там и там. Причем тут сокеты, если ты с маппингами работаешь? В гугле полно статей на тему сокетов. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения