Перейти к содержанию
edx

[C++] Обмен данными между GUI(exe) и DLL внедренной в процесс

Рекомендуемые сообщения

Всем здравствуйте. Я уже как-то затрагивал эту тему, но вскользь (там было про пайпы, чтение\запись памяти, 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, но без каких-либо примеров.

Изменено пользователем edx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
13 минут назад, edx сказал:

Необходимо организовать обмен данными между dll и exe.

В чём вопрос? Если тебе нужно организовать ipc, ты просто выбираешь подходящий тебе метод и реализуешь его. Также, ты можешь просто перенести контекст чужого процесса в свой контекст и работать с этим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, JustHack сказал:

В чём вопрос? Если тебе нужно организовать ipc, ты просто выбираешь подходящий тебе метод и реализуешь его. Также, ты можешь просто перенести контекст чужого процесса в свой контекст и работать с этим.

Ну, собственно вопросы пронумерованы в самом низу, многобукв что ли? Или мне предисловие убрать?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно из базуки по воробьям палить. И где-то это даже получится сделать. Но зачем? Есть именованные пайпы, юзай их, это самый удобный способ. А чтобы кидаться структурами можно заюзать те же протобуферы. По твоим вопросам:
 

13 часов назад, edx сказал:

1. Сколько хэндлов(если можно так сказать) файл маппинга можно открывать и как это скажется на скорости работы?

Можешь даже не думать об этом. Сами хендлы занимают мало места в памяти, и влиять на скорость практически не будут

 

13 часов назад, edx сказал:

2. Не произойдет ли конфликта, если gui и dll одновременно будут писать/читать в/из структуру(ы)? Да, мне писали про согласование чтения\записи, но что будет если просто забить на это?

Если одновременно читать разными маркерами - проблем не будет. При одновременной записи - будет. Без согласования ты получишь либо кашу из данных, либо эксепшн.

 

13 часов назад, edx сказал:

3. Если dll будет только писать в структуру, а gui только читать из нее, нужно ли думать о согласовании?

Если хочешь при чтении получать консистентные данные, то да, нужно. Если нет, то можно забить. Подозреваю, что тебе таки хотелось бы при чтении получать консистентные данные.

 

13 часов назад, edx сказал:

4. Есть ли какой-то мануал\статья по сокетам? По сути мне - нужно изменять значение переменных там и там.

Причем тут сокеты, если ты с маппингами работаешь? В гугле полно статей на тему сокетов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.