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

Dotnet Discussion :

Paramétrer une constante


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Par défaut Paramétrer une constante
    Bonjour à tous, je reviens vers vous avec une question bête ; je cherche à rendre paramétrable le chemin d'une dll non managée, mais étant donné qu'un argument d'attribut doit être constant, je suis bêtement bloqué...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport(_dllPath, CharSet = CharSet.Unicode), PreserveSig]
    private static extern int GetEngineObject([...]);
    Pour info, mon chemin est dans un fichier de paramétrage XML, mais je n'ai aucun moyen de l'affecter à une constante (logique me direz-voux), et mis à part mettre le chemin en dur dans mon code, je ne vois aucune solution.
    J'espère passer à côté de quelque chose et qu'une âme charitable pourra me donner une piste.

    D'avance merci.

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Il faut passer par LoadLibrary et GetProcAddress

    Un exemple : http://blogs.msdn.com/b/jonathanswif...23002900_.aspx

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Par défaut
    C'est ce que je suis en train de tester, effectivement.

    Merci pour ta réponse ^^

    EDIT
    Pour info, l'implémentation que je test :
    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
        class UnmanagedFunctionLoader
        {
            [DllImport("Kernel32.dll")]
            private static extern IntPtr LoadLibrary(string path);
     
            [DllImport("Kernel32.dll")]
            private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
     
            public static Delegate LoadFunction<T>(string dllPath, string functionName)
            {
                var hModule         = LoadLibrary(dllPath);
                var functionAddress = GetProcAddress(hModule, functionName);
     
                return Marshal.GetDelegateForFunctionPointer(functionAddress, typeof(T));
            }
        }
    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
        public class FReader10 : OcrEngine
        {
            [...]
     
            private delegate int GetEngineObjectDelegate(string devSN, string reserved1, string reserved2, ref IEngine engine);
            private static GetEngineObjectDelegate GetEngineObject;
     
            public FReader10(ParametrageLicenceMoteur parametrage, RecuperationImageRedressee recuperationImageRedressee)
            {
                // On charge les fonctions non managées et on les affectes aux délégués.
                GetEngineObject = (GetEngineObjectDelegate)
                    UnmanagedFunctionLoader.LoadFunction<GetEngineObjectDelegate>(
                        parametrage.DLLPath, "GetEngineObject"); 
     
                DeinitializeEngine = (DeinitializeEngineDelegate)
                    UnmanagedFunctionLoader.LoadFunction<DeinitializeEngineDelegate>(
                        parametrage.DLLPath, "DeinitializeEngine");
     
                [...]
            }
     
            private void LoadEngine(string key)
            {
                int hresult = GetEngineObject(key, null, null, ref _engine);
                Marshal.ThrowExceptionForHR(hresult);
            }
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Par défaut
    Bon, ben non, le code ci-dessus ne fonctionne pas ; lorsque j'appelle GetEngineObject mon objet _engine reste null (alors que via P/Invoke il est bien initialisé).

    Pour mon délégué j'ai conservé la même signature que celle utilisée via P/Invoke mais j'ai un doute sur le mot-clé ref. Qu'est ce qu'il pourrait me manquer pour que ça fonctionne ?

Discussions similaires

  1. [PHP 5.2] [POO] Utiliser une constante en paramètre par défaut
    Par christophedlr dans le forum Langage
    Réponses: 10
    Dernier message: 25/02/2009, 10h25
  2. Inclusion de fichiers et portée d'une constante
    Par Djakisback dans le forum C
    Réponses: 14
    Dernier message: 13/05/2005, 13h19
  3. [XSLT][Saxon]passage de paramètres à une template
    Par RB Greg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 12/05/2005, 16h29
  4. ajout d'une constante dans un select
    Par Shabata dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 18h24
  5. Partage d'une constante entre 2 fichiers en C
    Par elsargento dans le forum C
    Réponses: 6
    Dernier message: 29/09/2003, 22h17

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