РЕДАКТИРОВАТЬ:
Обратите внимание, что при дальнейшем размышлении я почти уверен, что это неправильный ответ. все еще плохая идея использовать несоответствующие соглашения о вызовах (таким образом, мой первоначальный инстинкт, что это была проблема), но в этом случае это, вероятно, не причина GPF.
ОРИГИНАЛ:
99% времени, эта ошибка означает, что вы неправильно поняли правила вызова. Прошло много времени с тех пор, как я написал в Delphi, но я думаю, что это решит вашу проблему:
procedure moveforward; export; stdcall;
Соглашение о вызовах обычно не является проблемой, когда вы используете только один компилятор, потому что все используют один и тот же. Это может быть проблемой, когда вы смешиваете языки, или даже если вы смешиваете компиляторы разных поставщиков. Соглашение о вызовах определяет, какой конец вызова должен очистить параметры; если обе стороны попытаются это сделать, это может привести к GPF.
По умолчанию атрибут DllImport
использует соглашение о вызовах CallingConvention.StdCall
, хотя вы можете переопределить его в самом атрибуте. К сожалению, соглашение о вызовах по умолчанию в Delphi - это тип, который не поддерживается (альтернативно называемый fastcall или register), поэтому единственный вариант - изменить сторону Delphi для использования stdcall.