Bonsoir,

J'ai défini des types de structure comme des pointeurs sur des void comme ca:

Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
		unsafe public struct HSESS
		{
			public void* hSess;
		}

J'ai une fonction d'une DLL qui me retourne un objet de type HSESS et je le comparer a un IntPtr.Zero.


Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
	if ( hSess != (crc.HSESS) IntPtr.Zero )

Le compilateur n'aime pas en précisant qu'il est impossible de convertir un IntPtr en HSESS, malgré le casting. Or, un IntPtr est un pointeur sur un void : void*, exactement comme un HESS.
Question: Pourquoi ca coince ? Une solution pourrait être de redéfinir le HSESS comme un IntPrt, mais je veux savoir.

Je suis obligé de comparer à un IntPtr.Zero parce que le hSess est retourné par du code (une DLL externe) non managé. Et dans ce cas le Null attendu (en cas d'échec de la fonction qui retourne le hSess)) en code non managé, est interprété ici en code managé comme un Null Pointer 0x00000000 ce qui n'est pas la même chose qu'un Null.

Au début je faisait le test comme ca : if ( !hSess.Equals("0x00000000") ) { etc. } et cela fonctionnait bien, sauf si la machine tourne en 32bits, ca pose des problèmes. D'où ma tentative d'utiliser le IntPtr.Zero qui est transparent/indépendant du système d'exploitation. Et la, impossible de convertir en hSESS par le compilateur. J'ai essayé l'inverse aussi:
if ( (IntPtr) hSess != IntPtr.Zero )

Merci.