Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Попытка чтения или записи в защищенную память. / 25 сообщений из 37, страница 1 из 2
21.05.2014, 14:26
    #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
21.05.2014, 14:43
    #38647647
Factorize
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
Pavluha,

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

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

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

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

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


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


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


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

Пробовал ставить Int16 и Int32, толку 0.
Дело в том, что некоторые методы работают, а некоторые нет. Вообще непонятно с чем все связано.
Просто беда
...
Рейтинг: 0 / 0
21.05.2014, 17:03
    #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
21.05.2014, 17:06
    #38647871
Pavluha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
Вот добился я, что на моей машине все работает корректно, но толку.
Пошел на 32 разрядную винду, запустил и все фатал полный.
Что за х...
...
Рейтинг: 0 / 0
21.05.2014, 19:41
    #38648043
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
Factorize
FactorizeAlex KuznetsovКроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte?


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

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

Может чего нового для себя открою.
...
Рейтинг: 0 / 0
21.05.2014, 19:59
    #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
22.05.2014, 09:37
    #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
22.05.2014, 09:45
    #38648402
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
Pavluha,

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

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

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

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



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

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

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

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

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

Нет не первый вызов, вызовы до этой команды уже были.
...
Рейтинг: 0 / 0
22.05.2014, 10:30
    #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
22.05.2014, 10:31
    #38648491
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
PavluhaНет не первый вызов, вызовы до этой команды уже были.
там и повреждения сделаны
чудес не бывает

для вызова _GetFldStr ручной маршаллиг излишен, достаточно [MarshalAs(UnmanagedType.LPStr)] string field
подозреваю, что и в других вызовах много чего наворочено - оттуда и ошибки
...
Рейтинг: 0 / 0
22.05.2014, 10:59
    #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
22.05.2014, 11:18
    #38648600
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
до этого вызова ошибки сделаны
...
Рейтинг: 0 / 0
22.05.2014, 11:36
    #38648639
Pavluha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Попытка чтения или записи в защищенную память.
Изопропил,

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



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


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