Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
-THE_MASTER666-
Заблокирован
#1

Передача структуры данных между DLL-ками / DLL - EXE в байтовом виде, влияет ли выравнивание? - C++

19.11.2014, 11:01. Просмотров 335. Ответов 0
Метки нет (Все метки)

Here i go again
Допустим есть исполняемый файл EXE и динамическая библиотека DLL.
В DLL в хэдэре каком - каком - нибуть объявляю простой тип данных - структура простых POD данных без указателей типа:
C++
1
2
3
4
5
struct DATA_PACK
{
      int x;
      float y;
};
В EXE файле хочу получить эти данные, но есть одно но.
Для полной независимости DLL от EXE данные передаются через указатель void*, так вот вопрос, если я в теле DLL-ке создал объект типа данных DATA_PACK (динамический или статический), заполнил поля и предоставил EXE_шнику указатель на эти данные, а так же вместе с этим указателем передал текстовую строку семантики самого типа, например: "[INT][FLOAT]". (про то что алокаторы разные у DLL и EXE сейчас речи не идёт - я в курсе и по этому указателю в EXE данные буду только читать)
Так вот, в EXE получил я указатель void* на данные в DLL, а так из описание - [INT][FLOAT], то есть я знаю, что по этому указателю лежит сначала один int, потом один float, могу ли я просто взять и прочитать сначала объём данных размеров int-а и заполнить им нужный свой int какой - то, потом со смещением в размер int-а так же прочитать FLOAT?

Казалось бы, конечно так можно сделать, но ведь компиляторы как - то по разному выравнивают структуры данных и ихние поля в памяти, сработает ли такое чтение во всех 100% случаев корректно?

Добавлено через 24 минуты
Ремарка:
DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct DATA_PACK
{
    int x;
    float y;
    int z;
};
...
void *Module::GetData()
{
    DATA_PACK* dp = new DATA_PACK;
    dp->x = 777;
    dp->y = 222.777f;
    dp->z = 333;
    return dp;
}
EXE:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct DATA_PACK_EXE
{
    int x;
    float y;
    int z;
};
 
...
 
DATA_PACK_EXE* dp = new DATA_PACK_EXE;
void* data = nullptr;
data = module->GetData();
memcpy(dp, data, sizeof(DATA_PACK_EXE));
DLL-ка подключается в рантайме динамический.
Так вот, если просто по указателю из DLL скопировать данные в аналогичную структуру в EXE, то вроде как всё нормально и поля правильно заполняются. (аналогичную структуру в ЕХЕ я взял для простоты, на самом деле данные по ихнему описанию нужно будет читать)

Всё бы хорошо, но для передачи данных таким макаром для каждой транзакции требуется вызов new, что очень накладно по времени в условиях множества высокочастотных транзакций.
Я вот подумал, может можно как - то ускорить этот процесс? Обойти алокацию памяти для передачи каждой транзакции?

Я уж думал, может можно как - то статические переменные (которые без оператора new) передавать из DLL В ЕХЕ ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 11:01     Передача структуры данных между DLL-ками / DLL - EXE в байтовом виде, влияет ли выравнивание?
Посмотрите здесь:

Собрать проект MSVS со всеми dll-ками - C++
Привет! есть проектWIN32 MSVS. все работает. как собрать его таким образом, чтобы не требовались студийные библиотеки на чистой винде? ...

Передача или редактирование данных в Dll - C++
Во общем ситуация такая: Инжектю я dll'ку в процесс, и она там в цыкле выводит на пример Messagebox(...), вот как я могу изменить...

Распространение данных между приложениями с использованием DLL - C++
Возможно ли использовать dll как "ретранслятор" данных для приложений? Те первым приложением вызывается функция "set", которая...

Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll - C++
Помогите, пожалуйста, написать за меня: 1) преобразование аргумента ком. строки -> в Unicode (какой не знаю): пытаюсь перевести код,...

[C++] dll в exe - C++
Как можно сделать так чтобы dll засунуть в exe программу чтоб при запуске она инжектилась в процесс hl.exe

Встроить dll в exe - C++
Создал простое окно в WinAPI, однако у пользователей у которых не стоит вижуал студио, требует msvcp120.dll Можно её как-то встроить в...

Dll и exe в одном файле - C++
Здравствуйте! Можно ли добавить свою dll в файл exe так чтобы при компиляции получился один файл. И при переносе не надо было таскать...

Объявление и создание глобальной структуры в dll - C++
объявление я сделал в .h файле но так как структуру нужно создать то вопрос в каком файле это делать и где(проект win32, Visual studio...

Модули. Ассоциативный массив. (DLL, EXE) - C++
Добрый день, нужна помощь в следующем задании: написать программу. программа состоит из двух модулей (не понимаю, как они...

Создание DLL и EXE в одном проекте - C++
Привет всем, я хочу создать большой проект и встала одна очень маленькая проблема, я чтобы не запутаться создал такую систему несколько...

Dll и EXE,как их связать?)Очь нада) - C++
Всем привет.Вот пару дней наза занялся програмированием на C++.До этого в visual Basic мутил програмки.Но basic детская песочница по...

В чем отличие сборки exe и dll файлов - C++
Извините если пишу не по тематике, подумал, что здесь это более актуально, чем в других темах на форуме. В общем вопрос аналогичен названию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru