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 :

modifier une struct marshallée en C#


Sujet :

C#

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 1
    Par défaut modifier une struct marshallée en C#
    Bonjour,

    je suis devant un problème de marshaling C/C#que je n'ai pas réussi à résoudre, j'ai besoin d'aide.

    J'ai une structure C dans un DLL (dont je n'ai pas le code) qui est déclarée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct virConnectCredential{
    int	type;
    const char *	prompt;
    const char *	challenge;
    const char *	defresult;
    char *	result;
    unsigned int	resultlen;
    }
    Côté C#, je l'ai marshalée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
            public struct virConnectCredential
            {
                [MarshalAs(UnmanagedType.I4)]
                public int type;
                [MarshalAs(UnmanagedType.LPStr)]
                public string prompt;
                [MarshalAs(UnmanagedType.LPStr)]
                public string challenge;
                [MarshalAs(UnmanagedType.LPStr)]
                public string defresult;
                public IntPtr result;
                [MarshalAs(UnmanagedType.U4)]
                public uint resultlen;
            }
    Côté C# un delgate reçoit en paramètre un pointeur sur la structure. La méthode du delegate est déclarée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public int AuthCallbackHandler([In, Out] IntPtr creds, uint ncred, IntPtr cbdata)
                {
                    AuthData authData = (AuthData) Marshal.PtrToStructure(cbdata, typeof (AuthData));
                    virConnectCredential cred = (virConnectCredential)Marshal.PtrToStructure(creds, typeof(virConnectCredential));
    }
    Le callback depuis C vers C# se passe bien, la structure est passée via le IntPTr "creds". Lorsque que je marshal la structure, la variable "cred" est coorectement initailisée, tout est ok.

    Mon problème est qu'à ce moment, je dois initialiser les membres "result" et "resultlen" de la structure. Et là je suis coïncé, ça la variable "cred" est une instance marshalée de la structure, or, je dois initialiser l'adresse de "result" afin que la DLL C puisse utiliser ce résultat.

    Comment puis-je faire ?
    J'ai tenté de calculer exactement les offsets de chaque membre et d'initialiser le membre "result" mais cela abouti à une erreur du type
    modification de la mémoire protégée...
    Si quelqu'un pouvait me tirer de ce mauvais pas...

  2. #2
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Si ca peut t'aider, voici un exemple ou j'ai eu a résoudre le passage d'un char * vers un string C#

    Dans le cas ci aprés StrPtr était un tableau de char *

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         IntPtr** StrPtr;
     
     
          count = bctaGetName(hBcta, attrId, out StrPtr);
     
          string[] NamesLg = new string[count];
          for (int i = 0; i < count; i++)
          {
            NamesLg[i] = Marshal.PtrToStringAnsi((IntPtr)StrPtr[i]);
          }

Discussions similaires

  1. mettre les termes d'un string dans une struct
    Par grand's dans le forum SL & STL
    Réponses: 17
    Dernier message: 29/11/2004, 17h43
  2. Modifier une partie de la source
    Par Sékiltoyai dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/10/2004, 21h52
  3. comment modifier une texture?
    Par tibyann dans le forum DirectX
    Réponses: 6
    Dernier message: 16/06/2004, 15h27
  4. [C#] Modifier une base de donnée
    Par Macintoc dans le forum Accès aux données
    Réponses: 15
    Dernier message: 03/06/2004, 11h49
  5. Modifier une partion ntfs avec Disk druid
    Par Sébastien dans le forum Administration système
    Réponses: 5
    Dernier message: 24/09/2003, 14h58

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