изменение QueryInterface из stdcall для регистрации - PullRequest
1 голос
/ 19 октября 2019

Мы используем Delphi 10.3.2. с поддержкой OSX64. Мы разрабатываем проект для OSX64, который использует скомпилированный GCC dylib. Библиотеки Dylib в OSX64 по умолчанию не являются stdcall или cdecl, поэтому мы должны удалить во всех функциях эти директивы. У нас есть проблема с QueryInterface, которую мы должны изменить с stdcall на ничто.

Мы попытались создать наш собственный класс MyIINterface и TMYInterfacedObject, но он не может скомпилироваться, так как возвращает ошибку

E2211 Объявление 'QueryInterface »отличается от объявления в интерфейсе« MyIInterface »mycom.pas (10): Связанный член: функция QueryInterface (const TGUID; out): HRESULT;

Как это возможно? Также, если мы переименуем QueryInterface в QuereyInterface2 в MyIINterface, ему все равно потребуется QueryInterface.

  type

  MyIInterface = interface
    ['{00000000-0000-0000-C000-000000000046}']
    function QueryInterface(const IID: TGUID; out Obj): HResult;
    function _AddRef: Integer; 
    function _Release: Integer;
  end;

  MyIUnknown = IInterface;

  TMyInterfacedObject = class(TObject, MyIInterface)
  protected

    function QueryInterface(const IID: TGUID; out Obj): HResult;

1 Ответ

1 голос
/ 19 октября 2019

Компилятор OSX64 игнорирует объявления соглашения о вызовах и использует соглашение о вызовах платформы для всех функций.

Предлагаемое вами изменение не влияет ни на какой сгенерированный код на этой платформе. Однако это изменение нарушит ваш код, если вы когда-нибудь придете к компиляции на платформе, где соглашение о вызовах имеет значение. Поэтому вам не следует вносить никаких изменений, которые вы предлагаете.

Какая бы ни была ваша проблема, это не решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...