2011-04-26 1 views
0

Nous avons une méthode déclarée dans un fichier IDL comme ceci:C# implemenation de déclaration IDL avec un INT_PTR

[id(7), helpstring("method SomeFunction")] HRESULT SomeFunction([in] INT_PTR windowHandle, [out, retval] VARIANT_BOOL* dlgResult); 

Nous la mise en œuvre en C# avec cette méthode:

public bool SomeFunction(int windowHandle) 

Ce fonctionne bien lors de la construction de 32 bits, mais quand nous construisons x64, les types ne correspondent pas car l'idl recherche une valeur de 64 bits et le C# attend une valeur de 32 bits.

L'utilisation de IntPtr dans le C# ne fonctionne pas car le code nécessite un long ou un int dans C#.

Y at-il un type que je peux utiliser dans la méthode C# qui sera compilé à long ou int selon la plate-forme? Je préfère ne pas avoir à dupliquer le code en ayant la fonction deux fois, et je ne suis pas sûr que nous pouvons changer l'IDL pour utiliser simplement Int64 en raison de la rétrocompatibilité.

Toute aide serait appréciée. Merci

Répondre

0

Allez dans Propriétés du projet ... et dans l'onglet Construction.

Là, vous pouvez trouver "Symboles de compilation conditionnelle", ajouter WIN64 pour votre plate-forme x64. Sauvegarder.

Pour « AnyCPU », vous voudrez probablement retirer cette plate-forme ...

Puis, en utilisation de code:

#if WIN64 
    long handle; 
    public bool SomeFunction(long windowHandle) 
#else 
    int handle; 
    public bool SomeFunction(int windowHandle) 
#endif 

Cependant, je pense que vous pouvez utiliser le IntPtr et convertir sa valeur à un int/long en fonction de sa propriété Size ...

0

Êtes-vous sûr que IntPtr ne fonctionnerait pas pour vous? La structure IntPtr a une surcharge de constructeur qui prend un Int32, et une autre qui prend un Int64. En outre, il a une méthode ToInt32() et une méthode ToInt64(). Votre code fonctionnerait quelque chose comme ceci:

public bool SomeFunction(IntPtr windowHandle) 
{ 
    // Implementation here. 
    // If you need the value of the pointer in the implementation, 
    // you can use: 
    // long actualValue = windowHandle.ToInt64(); 
} 

long actualHandle = 1234; 
IntPtr handlePtr = new IntPtr(actualHandle); 
bool returnValue = SomeFunction(windowHandle); 
+0

votre code au fond semble que cela fonctionnera, mais c'est tout le code C#. Le problème que j'ai est la méthode est déclarée dans un fichier IDL qui provoque l'erreur avec le code C# avec: csfile.cs (37): 'csnamespace.csproject.csfile' n'implémente pas le membre d'interface 'cpplib.Icppinterface.SomeFunction (long) 'J'obtiens cette erreur lors de la compilation de x64 si j'utilise int et int ou un IntPtr dans la méthode C#. Si j'utilise un IntPtr, il ne compile pas non plus pour 32 bits parce que la signature recherche spécifiquement un int. –

+0

Vous avez raison, ma solution ne fonctionnera pas pour vous; Je n'ai pas lu assez attentivement. Le problème est exactement que vous utilisez INT_PTR dans l'IDL, et je suppose que vous utilisez un tel mécanisme pour la compatibilité COM. Vous pouvez voir [cette référence MSDN] (http://msdn.microsoft.com/en-us/library/ms810720.aspx) pour une discussion du problème du point de vue IDL. Oui, il a 12 ans, mais je pense que c'est toujours pertinent pour votre situation, en particulier la section consacrée à INT_PTR et LONG_PTR. – JimEvans