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 :

problème de dll


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut problème de dll
    Bonjour,
    Je suis avec Windows 7 64 bits et j'essaye d'utiliser le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern bool GetCursorPos(ref System.Drawing.Point Pt);
    mais j'ai le message suivant:
    erreur->Tentative de chargement d’un programme de format incorrect. (Exception de HRESULT : 0x8007000B)

    qui signifie qu'il y a un problème de compatibilité de ma dll entre le mode 32 et 64 bits.

    J'ai fait plusieurs essaies:
    1-Mon application réglé en plateforme cible x86, et mon user32.dll provient du répertoire "C:\Windows\System32" -->toujours la même erreur
    2-Mon application réglé en plateforme cible x64, et mon user32.dll provient du répertoire "C:\Windows\SysWOW64" -->toujours la même erreur

    De plus tous le monde sur le net n'arrive pas a réglé ce problème.

    C'est pourquoi je vous soumet ce problème car c'est une prise de tête et je me demande surtout pourquoi cet dll est offerte et disponible sous Windows 7 64 bits sans pouvoir l'exploiter !!(merci Microsoft)

  2. #2
    Membre confirmé
    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
    Points : 552
    Points
    552
    Par défaut
    Salut !

    En fait tu as juste inversé ce qu'il fallait faire (mais il y avait de l'idée )

    Avec un outils comme Dependency Walker tu peux vérifier que:
    C:\Windows\System32\User32.dll est de type 64 bits
    C:\Windows\SysWOW64\User32.dll est de type 32 bits

    En effet la branche SysWow64 (regedit et filesystem) a été créé pour gérer l'historique des appli 32 bits.
    Naturellement, grâce à la bonne gestion de l'OS, depuis une app 32 bits tu ira piocher directement dans C:\Windows\SysWOW64\ ! donc tu n'as pas à explicitement le dire dans ton programme (ce qui fait qu'en 64 ou 32 ton programme continuera à marcher)

    Exemple de code qui marche en Any CPU, sur n'importe quelle plateforme:
    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
    33
    34
    35
            [StructLayout(LayoutKind.Sequential)]
            public struct POINT
            {
                public int X;
                public int Y;
     
                public POINT(int x, int y)
                {
                    this.X = x;
                    this.Y = y;
                }
     
                public POINT(System.Drawing.Point pt) : this(pt.X, pt.Y) { }
     
                public static implicit operator System.Drawing.Point(POINT p)
                {
                    return new System.Drawing.Point(p.X, p.Y);
                }
     
                public static implicit operator POINT(System.Drawing.Point p)
                {
                    return new POINT(p.X, p.Y);
                }
            }
     
            [DllImport("User32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool GetCursorPos(ref POINT p);
     
            private POINT _p;
     
            private void GetCursorPosBtn_Click(object sender, EventArgs e)
            {
                bool retVal = GetCursorPos(ref _p);
            }

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    Merci, j'ai décider d'utiliser la version 64 bits de user32.dll dans le répertoire "C:\Windows\System32"
    Pièce jointe 170410
    puis de coder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("C:\\Windows\\System32\\DLL\\user32.dll", CharSet = CharSet.Auto)] // 64 bits
    static extern bool GetCursorPos(ref System.Drawing.Point Pt);
    en réglant la plateforme cible en 64 bits:
    Pièce jointe 170411
    et bien j'ai toujours le message suivant:
    Pièce jointe 170412

    Donc, je ne comprends toujours pas ce qui cloche avec cette dll et ces réglages qui sont logiquement justes !!!
    Avis au lumière plus qu'éclairé, merci d'avance...

  4. #4
    Membre confirmé
    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
    Points : 552
    Points
    552
    Par défaut
    Ba je peux pas faire mieux que de t'avoir donné un code générique qui compile et qui marche...

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    Merci pour ton code aide qui marche.
    Je vais l'utiliser, mais je ne comprends pas pourquoi en spécifiant le chemin comprend de la dll (qui est en 64 bits) et en réglant la cible en 64 bits, l'application plante: c'est pas logique quand même...

  6. #6
    Membre confirmé
    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
    Points : 552
    Points
    552
    Par défaut
    tu as mis un mauvais path \DLL\... C:\\Windows\\System32\\DLL\\user32.dll
    Et je crois que tu n'utilises pas une struct pour le Point, ce qui doit poser des soucis pour le bas niveau en interop

    EDIT:
    Quoi que tu peux visiblement simplifier le code en supprimant la struct, et en utilisant la struc fournit par la framework:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            [DllImport("User32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool GetCursorPos(ref System.Drawing.Point p);
    ça marche aussi

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

Discussions similaires

  1. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  2. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 22h43
  3. Problème de dll à l'execution
    Par gege2061 dans le forum Windows
    Réponses: 3
    Dernier message: 11/03/2005, 11h22
  4. problème execution dll
    Par semenzato dans le forum MFC
    Réponses: 15
    Dernier message: 19/12/2003, 16h40
  5. Problème de DLL.
    Par Lunedor dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/11/2003, 10h17

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