Нам не хватает важных деталей.Мы не можем видеть реализацию fun
на стороне C ++, и мы не можем видеть, как вы объявили _fun
на стороне Delphi.
Однако есть одна ошибка, которую мы можем видеть.Соглашение о вызове для обратного вызова не совпадает.Код C ++ определяет обратный вызов как __cdecl
.Вам нужно использовать cdecl
для сопоставления на стороне Delphi, а не stdcall
.
Аналогично, я ожидаю, что ваш код Delphi неправильно определяет соглашение о вызовах для _fun
.Опять же, это должно быть cdecl
, но в сообщении об ошибке указывается, что ваше объявление действительно register
.
В итоге внесите следующие изменения в ваш код Delphi:
- Объявите обратный вызовтип функции как
cdecl
. - Объявить функцию, которая реализует обратный вызов как
cdecl
. - Объявить импорт
fun
как cdecl
.
Глядя на ваше редактирование, ваша ошибка проверки возвращаемого значения LoadLibrary
неверна.Ошибка указывается возвращаемым значением, равным нулю.Сравните на равенство с нулем, чтобы проверить наличие ошибок.
Вы также не можете проверить ошибки при вызове GetProcAddress
.Вам нужно обработать случай, когда возвращается nil
.Опять же, это может привести к ошибке во время выполнения с вашим кодом, как написано.
И код в вашем редакторе показывает, что все мои догадки были верны.Решение как подробно описано в пунктах выше.