2017-08-20 3 views
0

Voici ma classe et interface associée:Une interface COM peut renvoyer un entier au lieu d'un long?

[Guid("xx")] 
[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IStudentItem 
{ 
    string Type { get; set; } 
    DateTime Week { get; set; } 
    int Study { get; set; } 
} 

[Guid("yy")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
public class StudentItem : IStudentItem 
{ 
    public string Type { get; set; } 
    public DateTime Week { get; set; } 
    public int Study { get; set; } 
} 

Comme vous pouvez le voir, Study est défini comme un int.

Mais du côté MFC, lorsque j'utilise cette propriété, je me retrouve avec un long:

long lStudyNumber = 0; 
if(SUCCEEDED(studentItem->get_Study(&lStudyNumber))) 
    oEntry.iStudyPoint = static_cast<int>(lStudyNumber); 

Ma DLL est dans les deux 86x et 64x éditions. Est-il possible d'obtenir la propriété get_Study à la place pour renvoyer un integer à la place?

+1

Vous vous concentrez sur un problème inexistant. Un int dans un programme C# est une valeur de 32 bits. Il apparaît toujours comme 'long' dans les bibliothèques de type COM, également une valeur 32 bits pour MSVC++. Cette convention remonte aux jours où 'int' n'était * pas * une valeur de 32 bits pour le moment, COM a d'abord été implémenté sur la version 16 bits de Windows. Et donc requis «long». –

Répondre

1

Pourquoi voulez-vous cela? Utilisez un type approprié qui a du sens pour les données dans tous les systèmes d'exploitation et les bits.

Vous pouvez utiliser int. Les COM connaissent le type __int3264 dans le compilateur MIDL et dans le TLB (bibliothèques de types) et même un VARIANT a le type VT_INT.

Ainsi, une automatisation pilotée par IDispatch recevra également la valeur correspondante. Mais sachez que même s'il y a du marshaling, quand vous avez un serveur COM externe 64 bits et qu'un processus 32 bits demande des données, le marshaller va transformer le précédent VT_INT en VT_I8 ... D'un autre côté, un externe 32 bits Le serveur COM retournera un VT_INT en tant que VT_I4 à un processus 64bit ...

+0

Je ne veux surtout rien. Mon processus 32 appelle la DLL 32 bits et le processus 64 bits appelle la DLL 64 bits. Je suis heureux de le laisser tel quel. Les valeurs réelles seront toujours inférieures à 100. Le code existant utilisait 'integer', donc je cherchais simplement une simplification. J'entends ce que vous dites cependant. Je suppose que, avec le COM utilisant 'long', il en sera de même pour les compilations de bits de compilation. –

+0

Oui. Ou utilisez court int .. ou quoi que ce soit. – xMRi