Информация
Следующее предупреждение:
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 -|
http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.90).aspx
А как работает std :: vector<> инициализирован?
да, это ужасная идея использовать общий сегмент данных.
Поскольку выполняемый код находится в пространстве процессов этой программы, вы по умолчанию будете выделять память для вашего вектора из адресного пространства этих процессов. В котором любой другой процесс будет генерировать исключение, пытаясь прочитать или записать.
Вы можете написать свой собственный _alloc для извлечения из общей системной памяти, но это не решит проблемы инициализации.
Рекомендуемый метод для ipc — через файлы с отображением в памяти и мьютекс.
Чтобы заставить это работать так, как вы хотите, потребуется много кода. Удобно просматривайте код Std: Vector, пока не сможете извлечь класс из этого шаблона или выбрать более быстрый маршрут и написать свой собственный с нуля.
Других решений пока нет …