Поток
У меня есть DLL для чтения, написанная на C++
.
У меня также есть DLL писателя, написанная на каком-то языке (не на C++
).
DLL работают в одном и том же процессе синхронно.
- Reader DLL вызывает API DLL писателя,
GetData
- Writer DLL подготавливает данные, загружая их, распаковывая и т. Д.
- Reader DLL читает и использует данные
Вопрос
Каков рекомендуемый способ обмена данными между библиотеками DLL?
Подход 1
Reader DLL передает аргумент пути к файлу в Writer DLL и считывает данные из файла.
Против
Я бы хотел избежать записи данных на диск. Даже если это самое надежное решение, я бы хотел изучить различные варианты, поскольку мне не очень удобно записывать данные на диск, когда они вам не нужны.
Подход 2
Writer DLL будет выделять буфер в куче и возвращать адрес и размер в DLL читателя.
Против
Reader DLL должна освободить память. Это возможно? удалить память по адресу и размеру?
Кроме того, это, вероятно, большой буфер распределения и освобождения NO-NO между модулями / языками
Подход 3
Разделите GetData () на два вызова.
- Считыватель DLL вызывает GetDataSize ()
- Reader DLL выделяет буфер и передает адрес в Writer DLL
- Writer DLL заполняет буфер
- Reader DLL использует буфер
- Reader DLL освобождает буфер
Это приемлемый подход WINAPI.
Против
Я предполагаю, что Writer DLL способен знать размер данных до записи, но это не всегда так.
Подход 4
Использовать сопоставление файлов Windows
Против
Аналогичные минусы с подходами 2 и 3.
- Кто будет создавать сопоставление файлов?
- Кто разархивирует?
- Отображение файла не имеет динамического размера. Вы должны определить размер при его создании.