Как совместить перегрузку и stdcall в Delphi? - PullRequest
2 голосов
/ 06 июня 2011

У меня есть модуль данных SOAP, который экспортирует эту функцию

function MyFunction(MyParam1, MyParam2): boolean; stdcall;

Я могу использовать эту функцию из другого exe. Все работает.

Теперь я хочу использовать ту же функцию внутри того же проекта, в котором он находится. Я добавил его модуль к предложению использования, но он не распознал его (я получил Undeclared Identifier). Затем я добавил перегрузку, но не могу заставить ее работать.

function MyFunction(MyParam1, MyParam2): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2): boolean; overload;

Я получаю "определения полей не разрешены ..."

Я хочу иметь возможность доступа к функции извне, используя stdcall, но также внутренне, как вызовы функций обычной библиотеки. Кто-нибудь знает, как мне этого добиться?

Ответы [ 2 ]

8 голосов
/ 06 июня 2011

Ваша проблема не имеет ничего общего с соглашением о вызовах.

Несколько замечаний:

Глупый жук

Во-первых,

function MyFunction(MyParam1, MyParam2): boolean; stdcall;

- синтаксическая ошибка. Вы забыли указать типы MyParam1 и MyParam2.

Видимость

Рассмотрим единицу

  unit Unit1;

  interface

  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs;

  function Func1(MyParam1, MyParam2: integer): boolean;

  implementation

  function Func1(MyParam1, MyParam2: integer): boolean;
  begin
    ShowMessage('Func1');
  end;

  function Func2(MyParam1, MyParam2: integer): boolean;
  begin
    ShowMessage('Func2');
  end;

  end.

Только Func1 будет виден другим юнитам, потому что только Func1 является объявленным в разделе interface. А интерфейс - это то, что видят другие устройства.

Соглашения о вызовах

Вы можете использовать stdcall внутри своего проекта. Это не проблема вообще. Вы, вероятно, даже не заметите, что функция имеет «необычное» соглашение о вызовах.

перегруженные функции

Пара перегруженных функций (процедур) - это пара функций (процедур) с тем же именем, но с различными списками параметров , как в

function Add(A, B: integer): integer; overload;
function Add(A, B: real): real; overload;

Две функции не могут иметь одинаковые имена и списки параметров, даже если они перегружены. В самом деле, если бы это было разрешено, то как вообще компилятор узнает, какую функцию вы хотите вызвать?!

5 голосов
/ 06 июня 2011

Код, который вы представляете, не компилируется, потому что вы не указали типы параметров.Если вы сделаете это, то все будет работать нормально, если списки параметров различаются.

Например, это прекрасно компилируется:

function MyFunction(MyParam1, MyParam2: Integer): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2: Double): boolean; overload;

Но это не так:

function MyFunction(MyParam1, MyParam2: Integer): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2: Integer): boolean; overload;

Перегрузка - это когда у вас есть несколько методов с одинаковыми именами, но с разными списками параметров.Каждый раз, когда вы вызываете перегруженный метод, компилятор выбирает метод, списки параметров которого соответствуют передаваемым параметрам.


Я подозреваю, что вы пытаетесь перегрузить метод, используя одни и те же списки параметров для обеих версий метода,но другое соглашение о вызовах.Это не будет работать.Разрешение перегруженного метода не может быть выполнено на основе соглашения о вызовах (или типа возвращаемого значения функции в этом отношении).Просто используйте версию stdcall как внутри, так и снаружи.

...