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

[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. Есть ли какой-то мануал\статья по сокетам? По сути мне - нужно изменять значение переменных там и там.

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

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

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

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

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