Попытка чтения или записи в защищенную память.
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" ?
Хочется узнать экспертное мнение.
Хочется узнать ответ именно от Вас, а не отсылания в гугл и т.д.
Может чего нового для себя открою.