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 :

dll non managee


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut dll non managee
    Bonjour,

    J'ai un peu cherché dans la faq mais je n'ai rien trouvé qui puise m'aider.

    Je dois utiliser une fonction d'une dll non managée. La déclaration de cette fonction comprend des pointeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MADLL_API int __stdcall dllGetInfo(const char* filename, 
                                        char* pszFirstname, int nFirstnameLen, 
                                        int* pnRaceId, 
                                        double* pDateOfBirth);
    Dans mon code c#, j'ai fais (dans une classe marquée unsafe):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static extern int dllGetInfo(string filename,
                     string pszFirstname, int nFirstnameLen,
                     int* pnRaceId,
                     double* pDateOfBirth);
    Pour l'utiliser, j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String[] st = new String[4] { "".PadLeft(1000), "".PadLeft(1000), "".PadLeft(1000), "".PadLeft(1000) };
     
    int*[] itp = new int*[6];
     
    double dd = 0.0;
    double* d = ⅆ
     
    int r = dllGetInfo(@"Monfichier.truc",
        st[0], 1000,
        st[1], 1000,
        itp[1],
        d);
    (ne cherchez pas le pourquoi des tableaux surdimensionnés, j'ai juste épuré le code pour enlever les doublons inutiles)

    L'appel de la fonction se fait sans erreur mais ne me renvoie rien dans mes variables. Alors je me dis que je n'ai pas du écrire ça correctement.

    J'ai tenté de mettre un ref devant les chaines mais là, je ramasse une erreur de tentative d'écriture dans une zone mémoire protégée.

    Est-ce vous voyez une erreur la-dedans ?

    Merci d'avance du coup d'oeil

    Papy

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    vire le unsafe qui ne devrais jamais servir pour une utilisation "normale" et essaye une de ces signatures (vu que j'ai pas la dll, je peut pas tester) :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    [DllImport("madll.dll",CallingConvention=CallingConvention.StdCall)]
            static extern int dllGetInfo(
                [MarshalAs(UnmanagedType.LPStr)]    string filename,
                [MarshalAs(UnmanagedType.LPStr)]    string pszFirstname,
                                                    int nFirstnameLen,
                [In,Out]    ref int pnRaceId,
                [In,Out]    ref double pDateOfBirth);
     
    [DllImport("madll.dll",CallingConvention=CallingConvention.StdCall)]
            static extern int dllGetInfo(
                [MarshalAs(UnmanagedType.LPStr)]    string filename,
                [MarshalAs(UnmanagedType.LPStr)]    string pszFirstname,
                                                    int nFirstnameLen,
                ref int pnRaceId,
                ref double pDateOfBirth);
     
    [DllImport("madll.dll",CallingConvention=CallingConvention.StdCall)]
            static extern int dllGetInfo(
                [MarshalAs(UnmanagedType.LPStr)]    StringBuilder filename,
                [MarshalAs(UnmanagedType.LPStr)]    StringBuilder pszFirstname,
                                                    int nFirstnameLen,
                ref int pnRaceId,
                ref double pDateOfBirth);
     
    [DllImport("madll.dll",CallingConvention=CallingConvention.StdCall)]
            static extern int dllGetInfo(
                [MarshalAs(UnmanagedType.LPStr)]    StringBuilder filename,
                [MarshalAs(UnmanagedType.LPStr)]    StringBuilder pszFirstname,
                                                    int nFirstnameLen,
                [In,Out]    ref int pnRaceId,
                [In,Out]    ref double pDateOfBirth);
    (et croise les doigts )

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    smyley:

    Merci, la première déclaration ne déclenche pas d'erreur et me renvoie un résultat correct.

    alavoler:

    Merci aussi, je vais conserver précieusement ce lien.


  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    euh, j'ai parlé un peu vite.

    En fait, c'est la seconde syntaxe qui fonctionne sans erreur de violation de mémoire et qui me renvoie un résultat indiquant que la fonction s'est bien déroulé. Sauf que, les valeurs entières sont bien remplies avec les bonnes valeurs mais les paramètres de type string sont toujours vides.

    J'ai tenté de mettre un ref pour chacun mais là, retour de la violation mémoire partagée.

    J'ai voulu essayer un [in, out] mais ça me sort une erreur de syntaxe. Si c'est utilisable, je n'ai pas du savoir le positionner.


    suite ...

    [In, Out] [MarshalAs(UnmanagedType.LPStr)] string pszLastname

    ça, passe sans problème au niveau de la syntaxe mais la chaine n'est toujours pas modifiée


    arff ... résolu enfin avec un StringBuilder


    Un grand merci smyley .. :-)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/02/2007, 15h07
  2. Réponses: 6
    Dernier message: 31/08/2006, 14h54
  3. [Oracle] php_oci.dll non reconu ?????
    Par scorpking dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 04/08/2006, 15h34
  4. Réponses: 12
    Dernier message: 30/01/2006, 21h13
  5. Creation d'un message dans une dll non MFC
    Par dug dans le forum Windows
    Réponses: 1
    Dernier message: 29/11/2005, 12h50

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