В названии квеста упоминается соглашение о вызовах Паскаля, но тело вопроса никогда не возвращается к этой теме. В документации к DLL говорится, что она использует соглашение о вызовах Pascal? В наши дни это очень редкое соглашение о вызовах. (Он использовался в Windows API в 16-разрядные дни, и хотя некоторые заголовки тех времен все еще говорят PASCAL
сегодня, этот макрос был переопределен для ссылки на соглашение о вызовах stdcall.)
Вы не показали определение DllFn
- ни в коде C, ни в коде Delphi. В Си я представляю, что это макрос, который включает соглашение о вызове функции, поэтому найдите это определение, чтобы подтвердить, что на самом деле используется. В Delphi похоже, что вы используете его как указатель на функцию. Я рекомендую вам использовать те же имена функций в вашем приложении, что и DLL. Это облегчает жизнь всем участникам - никто больше не смотрит на код и не задумывается, какая функция на самом деле вызывается.
Если вы подтвердите, что DLL действительно использует соглашение о вызовах Pascal, то указать его в Delphi так же просто, как изменить директиву stdcall в объявлении функции на «pascal»:
RL6_GetLocalGeoDir: procedure(vszBuf: PAnsiChar; nBufSize: Integer); pascal;
Я также изменил аргумент PChar
, чтобы использовать PAnsiChar
, потому что теперь, когда некоторые версии Delphi являются Unicode, тип PChar
может означать PWideChar
, и вы не хотите этого здесь.