2015-02-28 4 views
1

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.

Répondre

0

Avez-vous essayé ceci:

[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; 
    [var: MarshalAs(UnmanagedType.Currency)] 
    property MyAmount: System.Decimal; 
end; 

Je n'ai aucun moyen de tester, mais pouvez-vous voir si cela fonctionne?

Cordialement,

Jeroen

+0

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 . –