Доступ к указателям на метод Delphi из другого модуля в другом пакете при компиляции с помощью 'dcc32 -JL' - PullRequest
0 голосов
/ 27 августа 2018

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

Я определил два пакета Delphi: BasePackage.dpk и AnotherPackage.dpk

package BasePackage;

requires
  rtl;

contains
  Base in 'Base.pas';

end.

и

package AnotherPackage;

requires
  BasePackage;

contains
  Another in 'Another.pas';

end.

и единицы

unit Base;

interface

type
  TMethod = procedure;

  TEncodeableType = record
    Method: TMethod;
  end;
  PEncodeableType = ^TEncodeableType;

procedure Method_Impl;

const
  TestMethod_Type: TEncodeableType = (
    Method: Method_Impl;
  );

implementation

procedure Method_Impl;
begin
end;

end.

и

unit Another;

interface

uses
  Base;

implementation

const
  ResponseType: PEncodeableType = @TestMethod_Type;

end.

В принципе, все прекрасно, и я могу даже сгенерировать базовые модули C ++ Builder с помощью 'dcc32 -JPHNEK --BCB', но когда я пытаюсь сгенерировать библиотечные файлы для C ++ Builder с помощью 'dcc32 -JPHNEK --BCB -JL', я получаю

>dcc32  -JPHNEK --BCB -JL BasePackage.dpk
Embarcadero Delphi for Win32 compiler version 32.0
Copyright (c) 1983,2017 Embarcadero Technologies, Inc.
BasePackage.dpk(10)
11 lines, 0.09 seconds, 3688 bytes code, 176 bytes data.
>dcc32  -JPHNEK --BCB -JL AnotherPackage.dpk
Embarcadero Delphi for Win32 compiler version 32.0
Copyright (c) 1983,2017 Embarcadero Technologies, Inc.
AnotherPackage.dpk(10)
Error: E2201 Need imported data reference ($G) to access 'TestMethod_Type' from unit 'Another'

Я пытался поиграть с разными вариантами компиляции (и, конечно, ввести {$G+} или {$IMPORTEDDATA ON} для юнитов и пакетов (хотя это все равно по умолчанию), но не видел, чтобы они имели какое-либо значение.

Пакеты скомпилированы без каких-либо или с этими параметрами в .cfg:

-$A+
-$B-
-$C-
-$D-
-$E-
-$F-
-$G+
-$H+
-$I-
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T+
-$U-
-$V-
-$W-
-$X+
-$Y-
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00300000
-Z

и без них или с этими параметрами в .dpk:

{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS ON}
{$RANGECHECKS ON}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST ON}
{$MINENUMSIZE 1}
{$IMAGEBASE $300000}
{$DESIGNONLY}
{$IMPLICITBUILD OFF} 

Любая идея, если бы я мог сделать эту работу (мне действительно нужны функциональные возможности в разных пакетах)?

Я скомпилировал с Delphi 10.2 Tokyo и XE4 с тем же результатом.

1 Ответ

0 голосов
/ 28 августа 2018

Я полагаю, что это проблема компилятора, и поэтому для моего случая может быть невозможно решить именно так. Но я могу объявить отображение с помощью переменных, а не констант (на практике у меня есть несколько таких внутренних структур).

Итак, эта версия Another.pas компилируется и работает:

unit Another;

interface

uses
  Base;

implementation

var
  ResponseType: PEncodeableType;

initialization
  ResponseType := @TestMethod_Type;

end.
...