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

Windows Forms Discussion :

[C#] Dll C++ et marshaling de VARIANT


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Points : 17
    Points
    17
    Par défaut [C#] Dll C++ et marshaling de VARIANT
    Bonjour,

    j'utilise une dll c++ en c# et celle-ci appelle un callback définit comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef VOID (CALLBACK* FONCTION_CALLBACK)(
         int NumServ,
         DWORD hGroup,
         DWORD count,
         DWORD *hItem,
         VARIANT *values,
         WORD *quality,
         FILETIME *time);
    remarque: hItem, values, et quality sont des tableaux de taille count.

    j'ai déclaré ce callback de la manière suivante en c# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public unsafe delegate void FONCTION_CALLBACK(
         int NumServ, 
         Int32 hGroup, 
         Int32 count, 
         Int32 *hItem, 
         object[] values, 
         UInt16 *quality, 
         FILETIME *time);
    Seulement, lorsque la méthode est appelée, le tableau de valeurs values est de taille 1, alors que le nombre d'items (count) est bien supérieur. Par contre, les tableaux hItem et quality sont bien respectés.

    Je supprose que c'est à cause de la déclaration avec [] du tableau values mais c'est le seul moyen que j'ai trouvé pour convertir les variant.

    Une idée? merci à tous.

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Après recherche tout ce matin, voici la solution :

    Déclaration du callback en c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public unsafe delegate void FONCTION_CALLBACK(
         int NumServ, 
         Int32 hGroup, 
         Int32 count, 
         IntPtr hItem, 
         IntPtr values, 
         IntPtr quality, 
         FILETIME *time);
    lors de l'appel de la fonction, pour récupérer un item courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int iItemCourant = 0;
     
    Int32 i32ItemHandle = Marshal.ReadInt32(hItem, 4 * iItemCourant);
     
    UInt16 ui16ItemQuality = (UInt16) Marshal.ReadInt16(quality, 2 * iItemCourant);
     
    IntPtr ipValue = (IntPtr) (((Int32)values) + 16 * iItemCourant);
     
    object oValue = Marshal.GetObjectForNativeVariant(ipValue);

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    ps : lien intéressant concernant l'appel de dll de code non managé :
    http://www.thecodeproject.com/dotnet/opcdotnet.asp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/06/2014, 15h49
  2. marshalling dll en C++
    Par sushis dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 01/05/2012, 19h30
  3. Réponses: 0
    Dernier message: 04/05/2011, 14h50
  4. [WD14] Type Variant dans l'appel d'une DLL
    Par GuiGui46 dans le forum WinDev
    Réponses: 3
    Dernier message: 11/06/2009, 14h08
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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