J'écris des interfaces COM dans Oxygene pour une classe d'encapsulable COM. Je ne peux pas comprendre comment marshall une propriété System.Decimal comme devise (type COM natif) puisque le compilateur Oxygene n'autorisera pas la syntaxe qui a fonctionné pour Delphi.NET.Attribut Include Unmanaged Type dans l'interface COM
Voici un abattirent exemple de la façon dont je l'ai fait avec succès dans Delphi.NET
[ComVisible(True)]
IVarious = interface(IInterface)
['{2DBF9ACD-1574-4BE4-812A-5D0B8E9AA025}']
function get_MyString: String;
procedure set_MyString(strValue: String);
[return: MarshalAs(UnmanagedType.Currency)]
function get_MyAmount: System.Decimal;
procedure set_MyAmount([MarshalAs(UnmanagedType.Currency)] curValue: System.Decimal);
property MyString: String read get_MyString write set_MyString;
property MyAmount: System.Decimal read get_MyAmount write set_MyAmount;
end;
// In Delphi.NET the implementing class only needed to have the methods, not the properties
[ComVisible(False)]
[ClassInterface(ClassInterfaceType.None)]
TVarious = class(TObject, Various)
private
FMyString: string;
FMyAmount: System.Decimal;
public
function get_MyString: String;
procedure set_MyString(strValue: String);
[return: MarshalAs(UnmanagedType.Currency)]
function get_MyAmount: System.Decimal;
procedure set_MyAmount([MarshalAs(UnmanagedType.Currency)] curValue: System.Decimal);
end;
(je ne vais pas montrer les implémentations getter TVarious et méthode setter car ils sont assez évident.)
Je comprends que Oxygene ne nécessite pas d'interfaces pour déclarer getter & méthodes setter. Il me semble qu'en fait il ne vous permet pas d'avoir getter & méthodes setter. Ainsi, la seule façon que je peux convertir en Oxygene (jusqu'à présent) est:
[ComVisible(True)]
[Guid('2DBF9ACD-1574-4BE4-812A-5D0B8E9AA025')]
IVarious = interface
property MyString: String read write;
property MyAmount: System.Decimal read write;
end;
[ComVisible(False)]
[ClassInterface(ClassInterfaceType.None)]
TVarious = class(IVarious)
public
property MyString: String;
property MyCurrency: System.Decimal;
end;
Mais mon problème est que je ne l'ai pas été en mesure de comprendre comment inclure les [MarshalAs (UnmanagedType.Currency)] attribuer dans l'une de ces déclarations.
L'aide sur la façon d'inclure cet attribut COM dans l'interface serait appréciée.
Votre modification ne compile. Merci. Mais le fait qu'il ne soit pas autorisé (ne compilera pas) s'il est inséré dans la déclaration d'interface est un bug que RemObjects a concédé (j'ai posté cette même question sur leur forum) et qu'ils espèrent aborder dans leur prochaine version d'Oxygene . –