powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Попытка чтения или записи в защищенную память.
37 сообщений из 37, показаны все 2 страниц
Попытка чтения или записи в защищенную память.
    #38647621
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходный код функции на Delphi
Код: pascal
1.
2.
3.
4.
5.
Function GetStatusNum(Num : Integer) : Integer;export; stdcall;
begin
 if Num in [1..6] then GetStatusNum:=StatusBuf[Num]
  else GetStatusNum:=0;
end;



Объявление в
Код: c#
1.
2.
        [DllImport("Azimuth.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "GetStatusNum")]
        public static extern int GetStatusNum(int byte1);// 1-6



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

Что можно сделать чтобы это побороть?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647647
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

а в Дельфийском то коде точно все правильно?
Плюс, проверьте что разрядность библиотеки совпадает с разрядностью managed проекта.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647657
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Factorize,

Код дельфийской функции я привел в посте выше.
Все компилируется под одним 4 фреймворком для 32 разрядной платформы.
Если все скомпилировать под 2 фреймворком, то все работает без проблем.
Куда копать я уже не знаю совсем :(
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647694
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

Вы привели только часть кода. StatusBuf может быть неверно инициализирована. В свою очередь, неправильно инициализирована она может быть и по каким-то внешним причинам.
Если дело не в этом, то я бы посмотрел в документации, какая разница в Pinvoke между .Net 2.x и 4.х, могли "правила игры" измениться.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647702
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,
может в вызове метода указать размерность int-а?
Ну, например : public static extern int GetStatusNum(Int32 byte1);

А вообще, Вы уверены, что массив StatusBuf инициализирован?

Кроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647711
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovPavluha,
может в вызове метода указать размерность int-а?
Ну, например : public static extern int GetStatusNum(Int32 byte1);


в .Net тип int всегда 32х битный. Не нужна тут никакая размерность.


Alex KuznetsovКроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte?


Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647743
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Kuznetsov,

Пробовал ставить Int16 и Int32, толку 0.
Дело в том, что некоторые методы работают, а некоторые нет. Вообще непонятно с чем все связано.
Просто беда
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647868
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не подскажите почему в дебаге такая ошибка происходит на вызов этого Marshal.FreeHGlobal(pfield);
Сама ошибка:
This may be due to a corruption of the heap, which indicates a bug in METRO.exe or any of the DLLs it has loaded.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38647871
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот добился я, что на моей машине все работает корректно, но толку.
Пошел на 32 разрядную винду, запустил и все фатал полный.
Что за х...
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648043
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Factorize
FactorizeAlex KuznetsovКроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte?


Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.Поясните, пожалуйста, почему же это будет методом написания извращённого кода, и как Вы определили, что это "Типичный bad practice" ?
Хочется узнать экспертное мнение.

Хочется узнать ответ именно от Вас, а не отсылания в гугл и т.д.

Может чего нового для себя открою.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648056
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaНе подскажите почему в дебаге такая ошибка происходит на вызов этого Marshal.FreeHGlobal(pfield);
Сама ошибка:
This may be due to a corruption of the heap, which indicates a bug in METRO.exe or any of the DLLs it has loaded.
не факт, что насрано имено в вызове GetStatusNum
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648393
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

так метод то все возвращает, что нужно и посмле этого я хочу освободить ресурс.
Вот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 [DllImport("Azimuth.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "GetFldStr")]
        public static extern IntPtr _GetFldStr(byte Num, IntPtr Field);
        public static string GetFldStr(byte Num, string Field)
        {
            try
            {
                IntPtr pfield = Marshal.StringToHGlobalAnsi(Field);

                IntPtr pstr = _GetFldStr(Num, pfield);
                string val = Marshal.PtrToStringAnsi(pstr);
                Marshal.FreeHGlobal(pfield);

                return val;
            }
            catch (Exception)
            {
                throw;
            }
        }
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648402
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

причина где-то раньше или в _GetFldStr

зы pstr не освобождается
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648408
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

И вариантов решения нет что ли никаких?

Если поставить вот такую строчку
Код: c#
1.
Marshal.FreeHGlobal(pstr);



, то ошибка на ней происходит.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648416
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluhaто ошибка на ней происходит.
как выделяется память для результата в _GetFldStr ?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648418
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Никак, код я привел.
Я получаю ссылку, а потом маршалю этим методом Marshal.PtrToStringAnsi
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648420
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaИзопропил,

Никак, код я привел.
Я получаю ссылку, а потом маршалю этим методом Marshal.PtrToStringAnsi
не виду кода на дельфи
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648430
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

тут я не могу помочь, библиотека не моя.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648453
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

вызов _GetFldStr - первое обращение к библиотеке? память испорчена где-то раньше
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648476
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Нет не первый вызов, вызовы до этой команды уже были.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648488
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pavluha,

Были вызовы этого метода:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 [DllImport("Azimuth.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "ExceptToLog")]
        public static extern int _ExceptToLog(IntPtr Msg);
        public static int ExceptToLog(string Msg)
        {
            try
            {
                IntPtr d = Marshal.StringToHGlobalAnsi(Msg);

                int val = _ExceptToLog(d);

                Marshal.FreeHGlobal(d);

                return val;
            }
            catch (Exception)
            {
                throw;
            }
        }
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648491
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaНет не первый вызов, вызовы до этой команды уже были.
там и повреждения сделаны
чудес не бывает

для вызова _GetFldStr ручной маршаллиг излишен, достаточно [MarshalAs(UnmanagedType.LPStr)] string field
подозреваю, что и в других вызовах много чего наворочено - оттуда и ошибки
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648555
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Я так делал раньше [MarshalAs(UnmanagedType.LPStr)] , но при такой реализации вылазила ошибка

FatalExecutionEngineError:
The runtime has encountered a fatal error. The address of the error was at 0x6f4293ba, on thread 0x22f0. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648600
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
до этого вызова ошибки сделаны
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648639
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Нет, до этого момента ошибок нет.
Я короче сделал так:
Код: c#
1.
2.
3.
4.
 catch (Exception)
            {
[color=red]                //throw; Убрал это[/color]
            }



теперь работает и у меня и на 32 разрядной, но я уверен ошибки периодически возникают
Отсюда вопрос, чем это грозит?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648647
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaНет, до этого момента ошибок нет.
они просто не проявились
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648898
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha... но я уверен ошибки периодически возникают
Отсюда вопрос, чем это грозит?Грозить это может потерей данных.

Для понимания что, где и когда может ломаться, приводите весь код с первого вызова, до того, где происходит ошибка.
И ещё конечно, объявления функций библиотеки.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38649446
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovFactorize
Factorizeпропущено...


Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.Поясните, пожалуйста, почему же это будет методом написания извращённого кода, и как Вы определили, что это "Типичный bad practice" ?
Хочется узнать экспертное мнение.

Хочется узнать ответ именно от Вас, а не отсылания в гугл и т.д.

Может чего нового для себя открою.

За такой код нужно бить по рукам. Использование byte вместо int - это потенциальный баг замедленного действия. Системы имеют свойство развиваться, и за byte значение рано или поздно переползет. Я не раз и не два видел такой баг в продакшене.
Второе - использование byte наведет на мысль, что она для чего-то тут нужен, только сбивает столку. Вы пишите, что это стрельба по воробьям - но в чем она состоит то? Это микрооптимизация. Что она есть, что ее нет - все работает одинаково. За такие оптимизации на языках высокого уровня, если они проводятся без особой надобности, нужно бить по рукам.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38649465
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaВот добился я, что на моей машине все работает корректно, но толку.
Пошел на 32 разрядную винду, запустил и все фатал полный.
Что за х...

Блин, да это стопудофф с разрядностью у вас нелады.
Проверьте, чему у вас равен авторIntPtr.Size.. IntPtr - это коварный тип, внутри сидит указатель разного размера.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38649770
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Factorize...Использование byte вместо int - это потенциальный баг замедленного действия. Системы имеют свойство развиваться, и за byte значение рано или поздно переползет. Я не раз и не два видел такой баг в продакшене.
Да, такое возможно, только тогда нужно избавиться от магических чисел [1..6] в коде, т.е. переработать немного архитектуру.

FactorizeВторое - использование byte наведет на мысль, что она для чего-то тут нужен, только сбивает столку. Вы пишите, что это стрельба по воробьям - но в чем она состоит то? Это микрооптимизация. Что она есть, что ее нет - все работает одинаково.
За такие оптимизации на языках высокого уровня, если они проводятся без особой надобности, нужно бить по рукам.
Про микрооптимизацию согласен, исследования ассемблерного кода вот такого примера:
Код: pascal
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;

var
  i: integer;
  ii: integer;
  b: Byte;
  a: integer;
  StatusBuf: array [1 .. 10] of integer;

Function GetStatusNumI(Num: integer): integer;
begin
  if Num in [1 .. 6] // <-- Магические числа ?
  then
    GetStatusNumI := StatusBuf[Num]
  else
    GetStatusNumI := 0;
end;

Function GetStatusNumB(Num: Byte): integer;
begin
  if Num in [1 .. 6] // <-- Магические числа ?
  then
    GetStatusNumB := StatusBuf[Num]
  else
    GetStatusNumB := 0;
end;

begin
    for i := 1 to 10 do
      StatusBuf[i] := i;

    ii := $00000001;
    b := $04;
    Readln;
    a:=GetStatusNumI(ii);
    Writeln('GetStatusNumI(ii) = ', a);

    a:=GetStatusNumB(b);
    Writeln('GetStatusNumB(b) = ', a);
    Readln;
end.

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

Честно, думал, что для вычисления адреса просто применят add .
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666318
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У коллег использующих библиотеку возникла ошибка чтения\записи в защищенную память при запуске проекта, как релиз.
Но, если запустить проект по админом ошибки нет. =-O

С чем это может быть связано?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666403
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нашел откуда ноги растут:

Вот этот метод бьет память:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[DllImport("Azimuth.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "GetFldStr")]
        public static extern IntPtr _GetFldStr(byte Num, IntPtr Field);
        public static string GetFldStr(byte Num, string Field)
        {
            String val = string.Empty;
            try
            {
                IntPtr pfield = Marshal.StringToHGlobalAnsi(Field);

                IntPtr pstr = _GetFldStr(Num, pfield);
                val = Marshal.PtrToStringAnsi(pstr);

                Marshal.FreeHGlobal(pstr);
                Marshal.FreeHGlobal(pfield);
            }
            catch (Exception)
            {
            }
            return val;
        }



Если закомментарить этот кусок кода:
Код: c#
1.
2.
                Marshal.FreeHGlobal(pstr);
                Marshal.FreeHGlobal(pfield);



То ошибки не возникает, но тогда я память не освобождаю. Как быть?
В дебаге на этих методах происходит ошибка: This may be due to a corruption of the heap, which indicates a bug in or any of the DLLs it has loaded.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666417
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

pfield - можно и освободить.

с pstr - дела хуже, маловероятно, что GetFldStr возвращает память, выделенную GlobalAlloc

значит будет утекать
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666438
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Как я понял, беда вообще в том, что я пустую строку передаю, от этого и все проблемы.
Вот описание метода

2-й параметр вообще непонятно что такое и что в него передавать. Если я правильно понимаю, то ссылку на обл куда будет сохранено значение.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666528
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha2-й параметр вообще непонятно что такое и что в него передавать. Если я правильно понимаю, то ссылку на обл куда будет сохранено значение.
как раз теперь понятно - это блок памяти, в который помещается результат и адрес этого блока возвращается функцией

выделить память под второй параметр с запасом, вызвать, проверить результат на Zero, скопировать строку,
освободить память(один единственный раз)
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666546
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Так и сделал, все заработало. Просто есть методы, которые возвращаю буфер макс размером 32000. И сколько под такое резервировать тогда?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666582
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaИзопропил,

Так и сделал, все заработало. Просто есть методы, которые возвращаю буфер макс размером 32000. И сколько под такое резервировать тогда?
если узнать заранее невозможно - всегда резервируйте максимум
32000 - это не так много

PS ну и освобождать нужно в блоке finally
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Попытка чтения или записи в защищенную память.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]