Я пытаюсь преобразовать свое приложение с Delphi XE8 в 10.2 Tokyo. Я получаю странные исключения во время выполнения с объектами приведения, предоставляемыми интерфейсом через пакеты crocss (bpl). когда я пытаюсь преобразовать объекты с ключевым словом as, я получаю это исключение во время выполнения:
Project Project1.exe поднял класс исключения EInvalidCast с сообщением «Недопустимый тип класса»
Вот код:
Интерфейс в отдельном пакете Plugin_interface.bpl :
unit MainIntf;
interface
Type IMainInft = interface
['{FE08C4A2-069C-4B8C-BB1B-445348CAB6A0}']
function GetForm : TObject;
end;
implementation
end.
Внедрение интерфейса в Project1.exe:
unit MainImpl;
interface
uses MainIntf;
Type TMain = class(TInterfacedObject,IInterface,IMainInft)
function GetForm : TObject;
end;
implementation
uses unit1;
function TMain.GetForm: TObject ;
begin
result:=Form1; // interafce is implemented on the main form so Form1 is rechable form here
end;
end.
И, наконец, в другом пакете "plugin.bpl" я пытаюсь получить объект из интерфейса:
unit Plugin_main;
interface
uses Mainintf, Vcl.Forms;
type TPlugin = class (Tobject)
IIMyRefernceToMianIntf: IMainInft;
end;
function RegisterPlugin(AMainIntf: IMainInft): TForm ; export;
procedure UnRegisterPlugin; export;
exports
RegisterPlugin,
UnRegisterPlugin;
var
Plugin_obj: TPlugin;
implementation
uses vcl.Dialogs,System.Classes ;
function RegisterPlugin(AMainIntf: IMainInft): TForm ;
var
MyForm : TForm ;
begin
Plugin_obj:=TPlugin.Create;
Plugin_obj.IIMyRefernceToMianIntf:=AMainIntf;
if AMainIntf.GetForm is TForm then
Showmessage ('Great it is a Tform') // will not happen
else
Showmessage ('Sorry it is not Tform'); // will happen
if TComponent (AMainIntf.GetForm).Classname='TForm1' then
Showmessage ('What ?? It is TForm1 decsendant from TForm so is it TForm after all ?!'); // will happen
// result:= AMainIntf.GetForm as TForm -- This will rise na exception
result:= TForm( AMainIntf.GetForm) ; // this will work
end;
procedure UnRegisterPlugin;
begin
Plugin_obj.Free;
end;
end.
Почему я не могу использовать ключевые слова «как» и «есть». Подойдет только жесткий кэтсинг, но я ненавижу это делать. на компиляторе XE8 все работало как положено - проблема существует на компиляторе XE 10.2 tokyo