Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2022, 12:35   #1
error404ru
 
Регистрация: 04.04.2012
Сообщений: 4
По умолчанию Интерфейсы C++ в Delphi

у меня есть .dll на с++ из которой я получаю функцию инициализации интерфейса INXForce
Код:
InitNXForce = function(var ppVal: INXForce): UInt32; cdecl;
на С++ INXForce выглядит так
Код:
class __declspec(novtable) INXForce
    {
    public:
       virtual uint32_t __stdcall GetValue (uint8_t* value) = 0;
       virtual uint32_t __stdcall SetValue (uint8_t value) = 0;
       virtual bool __stdcall IsValid (uint8_t value) = 0;
     }
я описал этот интерфейс на Delphi следующим образом:
Код:
INXForce = class abstract
  public
    function GetValue(var Value: Byte): Cardinal; virtual; stdcall; abstract;
    function SetValue(Value: Byte): Cardinal; virtual; stdcall; abstract;
    function IsValid(Value: Byte): Boolean; virtual; stdcall; abstract;
end
Дальше начинается для меня непонятное:
Код:
procedure TFormMain.FormCreate(Sender: TObject);
var
  lNXForce: INXForce;
  lValue: Byte;
begin
  InitNXForce(lNXForce); // возвращает 0, все хорошо. NativeUInt(lNXForce) = $145276181E0
  lNXForce.GetValue(lValue); // lValue получает 7 и переменная lNXForce получает другой адрес NativeUInt(lNXForce) = $14527610000
  lNXForce.GetValue(lValue);  // тут вываливается Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
end;
есть другие интерфейсы и методы. они аналогично частично работают, но почти у всех после вызова какого-то из методов слетает указатель в переменной интерфейса.
не могу понять что не так. куда смотреть?

Последний раз редактировалось error404ru; 22.12.2022 в 14:23.
error404ru вне форума Ответить с цитированием
Старый 23.12.2022, 14:24   #2
error404ru
 
Регистрация: 04.04.2012
Сообщений: 4
По умолчанию

проблема решилась описанием интерфейсов таким образом. мож кому будет полезно
Код:
  INXForce = ^TNXForce;
  TNXForceVTable = record
    GetValue: function (pThis: INXForce; var Value: Byte): Cardinal; stdcall;
    SetValue: function (pThis: INXForce; Value: Byte): Cardinal; stdcall;
    IsValid: function (pThis: INXForce; Value: Byte): Boolean; stdcall;
  end;
  TNXForce = record
    pVTable: ^TNXForceVTable;
  end;
error404ru вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерфейсы. Tison1251 Общие вопросы по Java, Java SE, Kotlin 3 07.12.2013 04:52
Интерфейсы Amgsys HQ Общие вопросы Delphi 2 14.08.2013 23:45
WIA COM интерфейсы gwinn Visual C++ 1 13.12.2012 14:51
Интерфейсы в C++ и Delphi: проблемы совместимости Celestia Общие вопросы C/C++ 4 27.04.2012 20:05
Интерфейсы в C++ и Delphi трудности перевода Celestia Общие вопросы C/C++ 3 25.04.2012 16:53