Хранение вектора в сегменте данных DLL

Информация

Следующее предупреждение:
LINK : warning LNK4039: section '.SHARED' specified with /SECTION option does not exist
всегда происходит всякий раз, когда я пытаюсь сохранить вектор в сегменте данных библиотеки динамической компоновки в C ++.

Для примера:

#include <vector>

struct Obj {
unsigned int A;
unsigned int B;
bool C;
std::vector< unsigned char > D;
};

#pragma data_seg( ".SHARED" )
std::vector< Obj > Objects;
#pragma data_seg()

#pragma comment ( linker,"/section:.SHARED,RWS" )

Однако, если я попытаюсь сохранить простую переменную, при компиляции не будет предупреждений.
Как это:

#pragma data_seg (".SHARED" )
int SimpleVariable = 0;
#pragma data_seg()

Я не совсем уверен, но, я полагаю, предупреждение было вызвано не инициализацией вектора? Если так, как мы можем инициализировать вектор, который будет храниться в сегменте данных?

У меня есть другой вопрос, это ужасная идея хранить вектор в сегменте данных в DLL?

Моя цель

Я пытаюсь поделиться содержимым вектора внутри DLL, которая будет загружена в несколько разных процессов.

Как это:

process_1.exe
- example.dll -|    * access the same vector (SomeVector) as
|      example.dll within process_2
|
std::vector SomeVector; // vector in example.dll
|
process_2.exe      |    * access the same vector (SomeVector) as
|      example.dll within process_1
- example.dll -|

3

Решение

http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).aspx

А как работает std :: vector<> инициализирован?

да, это ужасная идея использовать общий сегмент данных.

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

Вы можете написать свой собственный _alloc для извлечения из общей системной памяти, но это не решит проблемы инициализации.

Рекомендуемый метод для ipc — через файлы с отображением в памяти и мьютекс.

Чтобы заставить это работать так, как вы хотите, потребуется много кода. Удобно просматривайте код Std: Vector, пока не сможете извлечь класс из этого шаблона или выбрать более быстрый маршрут и написать свой собственный с нуля.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]