Вопрос, поднятый в данном запросе, связан с возникновением исключений при попытке вызова внешней функции через метод класса в среде разработки Delphi XE5. Проблема заключается в том, что при вызове метода Start объекта TAutoMapa происходит ошибка, в то время как прямой вызов той же функции AmApiInit работает корректно.
Описание проблемы
В коде, представленном пользователем, используется внешняя функция AmApiInit, объявленная в модуле tpcAmApi.dll. Эта функция вызывается из метода Start класса TAutoMapa, который в свою очередь используется в обработчике события Button1Click формы TForm1. При вызове метода AutoMapa.Start через объект AutoMapa, созданный в событии FormCreate, происходит исключение.
Анализ проблемы
По сообщениям пользователя, проблема не связана с отсутствием создания объекта AutoMapa, так как прямой вызов функции AmApiInit работает корректно. Возможной причиной может быть несоответствие типов параметров или различия в соглашениях вызова функций между C++ и Delphi.
Подтвержденный ответ
После анализа предоставленного кода и комментариев пользователей, было выявлено, что проблема связана с некорректным объявлением соглашения вызова функции AmApiInit. В C++ функция объявлена с соглашением __cdecl, в то время как в Delphi по умолчанию используется соглашение stdcall. Также было отмечено, что тип BOOL в C++ соответствует типу LongBool в Delphi.
Исправленное объявление функции в Delphi должно выглядеть следующим образом:
function AmApiInit(bStartAmIfNotRunning: LongBool; dwTimeout: LongWord; pbProcessCreated: PLongBool): LongBool;
cdecl; external 'C:\Users\Vexatus\Documents\RAD Studio\Projects\automapa\tpcAmApi.dll' name '?AmApiInit@@YA_N_NKPA_N@Z';
Также возможно, что функция AmApiInit не принимает nil в качестве последнего параметра, и в этом случае следует объявить локальную переменную типа LongBool и передать её адрес в функцию.
Пример кода
var
processCreated: LongBool;
begin
processCreated := False;
Result := AmApiInit(True, 10000, @processCreated);
end;
Заключение
После внесения изменений в объявление функции AmApiInit и исправления типов параметров, проблема с исключениями при вызове внешней функции должна быть решена. Важно тщательно следить за соответствием типов и соглашений вызова функций при работе с внешними библиотеками в Delphi.
Устранение проблемы с вызовом внешней функции из Delphi XE5, связанной с неправильным соглашением вызова и типом параметров.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.