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

Pavluha
Дата: 21.05.2014 14:26:37
Исходный код функции на Delphi
Function GetStatusNum(Num : Integer) : Integer;export; stdcall;
begin
 if Num in [1..6] then GetStatusNum:=StatusBuf[Num]
  else GetStatusNum:=0;
end;


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


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

Что можно сделать чтобы это побороть?
Factorize
Дата: 21.05.2014 14:43:17
Pavluha,

а в Дельфийском то коде точно все правильно?
Плюс, проверьте что разрядность библиотеки совпадает с разрядностью managed проекта.
Pavluha
Дата: 21.05.2014 14:56:56
Factorize,

Код дельфийской функции я привел в посте выше.
Все компилируется под одним 4 фреймворком для 32 разрядной платформы.
Если все скомпилировать под 2 фреймворком, то все работает без проблем.
Куда копать я уже не знаю совсем :(
Factorize
Дата: 21.05.2014 15:26:15
Pavluha,

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

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

Кроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte?
Factorize
Дата: 21.05.2014 15:36:54
Alex Kuznetsov
Pavluha,
может в вызове метода указать размерность int-а?
Ну, например : public static extern int GetStatusNum(Int32 byte1);


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


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


Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.
Pavluha
Дата: 21.05.2014 15:51:00
Alex Kuznetsov,

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


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

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

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