Member 13218289 Ответов: 1

Проблема с передачей указателей в windows 10


Я использую Visual Studio 2012 с Windows 10 и испытываю проблемы с передачей указателей из одного класса в другой с помощью C++. У меня есть класс:

CSAMT_Intf {}, который содержит переменные и структуры. Я использую этот класс для создания сегмента общей памяти для сохранения данных. Я использую следующий код для создания указателя на общую память, а затем передаю его другому классу.

тап_п(массив&ЛТ;система::строка ^&ГТ; ^аргументы)
{
m_pSharedMemory = новый CSAMT_Intf;
m_pSharedMemory->CreateMapping();

m_pSockcomm = новый CSAMT_Sock(m_pSharedMemory);
}

Принимающий класс обрабатывает указатель:

CSAMT_Sock::CSAMT_Sock(CSAMT_Intf* pSharedPtr)
{
m_pSharedPtr = pSharedPtr; // определяется как CSAMT_Intf *m_pSharedPtr в заголовочном файле

}

Когда pSharedPtr получен, он содержит все адреса и данные правильно, но когда знак равенства обрабатывается в Windows 7, данные остаются нетронутыми, но в Windows 10 некоторые данные имеют "ошибку:не удается получить значение"

Что я уже пробовал:

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

Member 13218289

Общая память содержит int и указатели, такие как дескрипторы и указатель на структуру. Int распознаются, но все, что является указателем, не работает.

1 Ответов

Рейтинг:
0

David O'Neil

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

Windows лучше защищает программы друг от друга, чем это было в Windows 7. Возможно, вам придется создавать объекты в общей памяти, если вы хотите использовать их между процессами. Или создайте их в библиотеке dll, которую также будет использовать ваша другая программа.

Надеюсь, это поможет. Если вы делаете все в одной программе, и мой анализ неверен, вам нужно будет дать более подробную информацию.


Member 13218289

Это происходит в одном приложении. У меня есть два разных класса в одном приложении. Сегмент общей памяти создается потому, что он используется во многих приложениях и библиотеках DLL. Вот почему я передаю адрес сегмента общей памяти каждому из классов, которые могут его использовать. Этот же проект работает точно так же с тех пор, как он был создан с помощью Windows XP.

David O'Neil

Таким образом, вы передаете указатель " в "свой блок общей памяти, затем получаете доступ к этой общей памяти в той же программе, чтобы получить этот "указатель", а затем получаете доступ к памяти, на которую указывает этот "указатель".

Что произойдет, если, вместо того чтобы хранить его как указатель на общую память, то оператора reinterpret_cast его и хранить его как dword (если 32 бит) в разделяемой памяти, а затем оператора reinterpret_cast, что типа DWORD обратно в указатель в основной программе после того, как вы восстановить его?

Пробовали ли вы передать указатель непосредственно в принимающий класс без использования общей памяти, а затем сравнить, как это работает по сравнению с подходом с общей памятью?

Rick York

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

Ой - я только что заметил ^s. Это подразумевает "управляемый c++", так что не обращайте внимания. Я не признаюсь, что знаю об этом.