IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Convertion de type et Casting sur IntPtr


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 277
    Points : 64
    Points
    64
    Par défaut Convertion de type et Casting sur IntPtr
    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.

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Salut Jolt0x,

    J'ai jamais trop travailler en unsafe donc je veux pas dire de betise, mais pour moi ca a du sense.
    Tu cast IntPtr.Zero vers un type que tu defini, il n'y a aucune chance que les deux type soit castable dans ce sens.
    La raison est que IntPtr.Zero est peut etre void*, ta structure contient peut etre un membre de type void*, mais en aucun cas IntPtr.Zero est une instance de type HSESS, donc pas de cast.

    Ce que tu peux eventuellement faire, c'est caster IntPtr.Zero vers void* et comparer les references.

    Alain.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

Discussions similaires

  1. Cast sur un type générique
    Par debloc dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 31/10/2012, 22h23
  2. [C#] Problème de Cast sur un type générique
    Par Bobbledople dans le forum C#
    Réponses: 2
    Dernier message: 10/06/2009, 11h04
  3. Réponses: 16
    Dernier message: 12/11/2008, 20h36
  4. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46
  5. Convertion de type VARIANT à type CString
    Par j_grue dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2002, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo