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

Попытка чтения или записи в защищенную память это часто свидетельствует о том что другая память

  • автор:

Ошибка: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена

Написан проект на c# и dll на c++, по отдельности компилируется без ошибок, но когда запускаешь проект, доходит до второй функции (написанной в dll) и выдает эту ошибку.

Отслеживать
2,805 5 5 золотых знаков 21 21 серебряный знак 38 38 бронзовых знаков
задан 20 дек 2016 в 12:22
51 1 1 золотой знак 2 2 серебряных знака 5 5 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Это означает что вы пытаетесь писать или читать по адресу памяти, который не принадлежит вашей программе. Например, вы можете писать или читать память за пределами динамически выделенного массива, или обращаться к памяти по null-указателю.

То, что программа компилируется, не означает, что она корректная.

Отслеживать
ответ дан 20 дек 2016 в 12:28
Vlad from Moscow Vlad from Moscow
44.8k 3 3 золотых знака 38 38 серебряных знаков 89 89 бронзовых знаков

«или обращаться к памяти по null-указателю» — в большинстве случаев там такой ошибки не будет. По крайней мере, в шарпе.

20 дек 2016 в 12:53
@Qwertiy Как я понял, ошибка возникает при вызове C++ функции из dll.
20 дек 2016 в 12:58

Но ведь шарп разворачивает обращения по адресам меньше 65К в NullReferenceException, а большие сыплятся с access violation. Разве ситуация изменится, если соответствующее обращение произойдёт в коде на плюсах?

20 дек 2016 в 14:17

@Qwertiy Откуда вы знаете, что делается в функции на C++? Может быть там имеет место попытка изменить строковый литерал, или происходит выделение памяти, или происходит сравнение строк с использованием null-указателя или происходит некорректный вызов Windows API.

20 дек 2016 в 14:26

Я имел в виду ситуацию: код на си++ обращается по нулевому указателю (ну где-то рядом). Неужели вызывающий код на шарпе не превратит это в NullReferenceException в соответствии со своими правилами? Откуда теперь появилось про некорректный вызов или изменение readony — я же с этим не спорил.

Попытка чтения или записи в защищенную память

Здравствуйте! Вот такая ошибка:
«Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.»
при попытке выполнить функцию импортированную из библиотеки setupapi.dll, вот таким образом:

[DllImport("setupapi.dll", EntryPoint = "SetupDiGetHwProfileList")] public static extern void SetupDiGetHwProfileList(out StringBuilder HwProfileList, string HwProfileListSize, out StringBuilder RequiredSize, out StringBuilder CurrentlyActiveIndex);

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Попытка чтения или записи в защищенную память
Доброго времени суток, форумчане! Возникла такая проблема — при вызове функции из dll(написана на.

Попытка чтения или записи в защищенную память
Дело в том что у меня Windows 8, при попытке запуска проекта выдает ошибку: "Необработанное.

Попытка чтения или записи в защищенную память
Hello, ребят, такой вопрос. Есть програмка, суть ее — найти часть картинки на другой, ту что ищем.

Попытка чтения или записи в защищенную память из dll на C++
Работаю в Visual Studio 2008. Столкнулся со следующей проблемкой. Допустим, есть dll-ка на C++.

1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
StringBuilder статический класс, попробуйте заменить на string или char[] или char*
340 / 340 / 90
Регистрация: 04.03.2010
Сообщений: 648
несоответствие типов, курите мануалы по dll’ке
Регистрация: 05.06.2012
Сообщений: 1,020

ЦитатаСообщение от Learx Посмотреть сообщение

StringBuilder статический класс, попробуйте заменить на string или char[] или char*

Добавлено через 34 минуты

ЦитатаСообщение от andrew_w2k Посмотреть сообщение

несоответствие типов, курите мануалы по dll’ке
Как бы узнать какой тип соответствует PDWORD в C# ??
1272 / 973 / 113
Регистрация: 12.01.2010
Сообщений: 1,971

прочитать его название
p — указатель
d — двойной
word — слово (2 байта, так уж сложилось исторически)
-> указатель на двойное слово
-> указатель на 4 байта
-> обычный Int

Добавлено через 2 минуты
а проще создать проект с++, написать PDWORD, правомышью клик и «перейти к определению»

Регистрация: 05.06.2012
Сообщений: 1,020

m0nax, В это вник, не могу понять как так, функция возвращает «1» хотя должна вернуть список ID устройств подключенных к компьютеру, или это указатель на первый элемент массива содрежащий список?
Если так может посоветуете как его считать?

1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
почитайте статью посмотрите внимательно пример и поймете куда сохраняются данные.
340 / 340 / 90
Регистрация: 04.03.2010
Сообщений: 648

ЦитатаСообщение от VoltDeMar Посмотреть сообщение

В это вник, не могу понять как так, функция возвращает «1» хотя должна вернуть список ID устройств подключенных к компьютеру, или это указатель на первый элемент массива содрежащий список?

по-моему, в описании она bool возвращает
Регистрация: 05.06.2012
Сообщений: 1,020

ЦитатаСообщение от Learx Посмотреть сообщение

почитайте статью посмотрите внимательно пример и поймете куда сохраняются данные.

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

Добавлено через 1 минуту

ЦитатаСообщение от andrew_w2k Посмотреть сообщение

по-моему, в описании она bool возвращает
Я пытаюсь получить параметры помеченные как Out ведь они, я так понимаю, тоже должны возвращаться?
340 / 340 / 90
Регистрация: 04.03.2010
Сообщений: 648

ЦитатаСообщение от VoltDeMar Посмотреть сообщение

тоже должны возвращаться
передаются по ссылке
Регистрация: 05.06.2012
Сообщений: 1,020

ЦитатаСообщение от andrew_w2k Посмотреть сообщение

передаются по ссылке
т.е в ссылку на переменную которую я передаю в функцию?
Объявлены:

[DllImport("setupapi.dll", EntryPoint = "SetupDiGetHwProfileList")] public static extern bool SetupDiGetHwProfileList(out int HwProfileList, string HwProfileListSize, out int RequiredSize, out int CurrentlyActiveIndex);
1 2 3 4 5
bool f = SetupDiGetHwProfileList(out val1, "5", out val2, out val3); if ( f == true) label9.Text = "true " + val1 + " " + val2 + " " + val3; else label9.Text = "false " + val1 + " " + val2 + " " + val3;

Почетный модератор

Эксперт .NET

8717 / 3669 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9

Лучший ответ

Сообщение было отмечено SatanaXIII как решение

Решение

О ужас, откуда Вы string/StringBuilder взяли? Почему void возвращает? Почитайте документацию по функции, там нигде даже намека на использование строк нет.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[DllImport("setupapi.dll", SetLastError = true)] public static extern bool SetupDiGetHwProfileList( [Out] int[] HwProfileList, int HwProfileListSize, out int RequiredSize, out int CurrentlyActiveIndex ); private const int ERROR_INSUFFICIENT_BUFFER = 122; static void Main(string[] args) { int[] profileList = null; int profileListSize = 0; int activeIndex = 0; SetupDiGetHwProfileList(profileList, profileListSize, out profileListSize, out activeIndex); if (ERROR_INSUFFICIENT_BUFFER != Marshal.GetLastWin32Error()) throw new Win32Exception(); profileList = new int[profileListSize]; if (!SetupDiGetHwProfileList(profileList, profileListSize, out profileListSize, out activeIndex)) throw new Win32Exception(); Console.ReadKey(); }

Добавлено через 7 минут

ЦитатаСообщение от VoltDeMar Посмотреть сообщение

список ID устройств подключенных к компьютеру

Данная функция возвращает список профилей оборудования которые существуют в системе.
Hardware profiles overview

Попытка чтения или записи в защищенную память это часто свидетельствует о том что другая память

Ошибка происходит при попытке обновлятора подключиться к базе через COM. Полный текст ошибки такой:

Помогает переустановка платформы 1с и/или переход на следующий релиз.

Внимание. Если у вас версия платформы 8.3.20.1549, то вам сюда.

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. на — OpenFileDialog1.ShowDialog()

Есть приложение которое работает с базой база на акссесе вот строка «Provider=Microsoft.ACE.OLEDB.12.0;Data Source= *******.accdb»
Как исправить? Выдаеть «Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.» на OpenFileDialog1.ShowDialog() ЗЫ если после загрузки формы сделать OpenFileDialog1.ShowDialog() то дальше его можно вызывать хоть мульён раз! а вот если после загрузки формы обратится к
Using connection As New OleDbConnection(ConnektBase)
Dim command As New OleDbCommand(comstr, connection)
connection.open
то тогда появится выше описанная ошибка!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *