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

Interfaçage autre langage Python Discussion :

Enregistrer des dlls & des tlb


Sujet :

Interfaçage autre langage Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut Enregistrer des dlls & des tlb
    Bonjour,
    Je travaille sous Windows, je débute en python, et j'ai besoin de faire un utilitaire pour (ré)enregistrer une série de fichiers dont l'extension est soit dll, ocx ou tlb (une trentaine) et afficher le résultat de l'enregistrement pour chacune d'elles.

    En cherchant j'ai trouvé ceci pour enregistrer les dll & ocx:
    from ctypes import windll
    dll = windll[chemin]
    result = dll.DllRegisterServer()

    Ca semble marcher, mais je ne suis pas sur de l'interprétation de "result".
    result = 0 => enregistrement a échoué?
    result = -1 => enregistrement réussi?

    Quelqu'un pourrait il me le confirmer svp ou m'indiquer les valeurs possibles? (car j'ai eut des résultats variables pour l'enregistrement d'une même dll!)
    Je n'ai par ailleurs pas pu trouver la moindre documentation sur windll. Savez vous ou en trouver?

    Ceci dit, y a t'il d'autre méthode que de passer par windll? (j'ai pensé à ctypes, mais j'avoue ne pas avoir compris comment mettre en oeuvre)

    Pour les tlb, en revanche, je n'ai rien trouvé (à part ctypes encore?). Quelqu'un aurait il une idée pour me dépanner svp?

    A bientot
    Yann

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut du mieux, mais pas suffisant
    Plutôt que d'utiliser la méthode précédente (avec windll),j'ai essayé avec la fonction popen3 (du module os).
    Ca donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if lextension.lower() == 'tlb':
                        #Enregistrement des tlb
                        aenregistrer ='regtlib '+'-q \"'+str(chemin)+'\"'   # l'option -q indique qu'il ne faut pas de message
    else:
                        #Enregistrement dll & ocx
                        aenregistrer = 'regsvr32 '+'\"'+str(chemin)+'\" /s' #l'option /s indique qu'il ne faut pas de message de confirmation
                    r1,r2,r3 =os.popen3(aenregistrer)
                    result = r3.read()
                    r1.close()
                    r2.close()
                    r3.close()
    L'ennui c'est que le résultat (dans 'result') est toujours vide, que l'enregistrement soit réussi ou non (ce que je peux voir en retirant l'option "/s" de la commande regsvr32).
    Quelqu'un aurait il une idée pour déterminer exactement le résultat (même en utilisant autre chose que popen3?

    ps: la variable 'lextension' contient l'extension du fichier a enregistrer..

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut ..
    Je crois avoir un peu progressé, voici le code de test que j'utilise:
    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
    # -*- coding: cp1252 -*-
    from ctypes import windll
    import subprocess
    import os.path
    lesfichiers = ('c:\\windows\\system32\\msscript.ocx',
              'c:\\windows\\system32\\GTDownDE_130.ocx',
              'c:\\zipo.dll',                                                                                   #Dll inexistante pour tester le comportement du script
              'c:\\windows\\system32\\vss_ps.dll',
              'c:\\windows\\system32\\stdole2.tlb')     
     
    for thefichier in lesfichiers:
            if thefichier[-3:]=='dll' or thefichier[-3:]=='ocx':    #On lit les 3 derniers caractères avec [-3:]
                try:                                                #Si on a à faire à une dll, ou une ocx
                    dll=windll[thefichier]
                    enr = dll.DllRegisterServer()                #On l'enregistre avec DllRegisterServer()
                except:
                    result=-1
            else:
                #Le fichier est un tlb
                letlb ='regtlib '+'-q \"'+str(thefichier)+'\"'      #l'option -q indique qu'il ne faut pas de message
                enr = subprocess.Popen(letlb,shell=True)            #On ne s'occupe pas du résultat, il est toujours réussi..
            result = ctypes.GetLastError()                          #Le résultat est le numéro d'erreur (nul si tout est ok)
            print os.path.basename(thefichier),'\t=====>\t'+ctypes.FormatError(result)+'('+str(result)+')' #impression du résultat (avec n0 d'erreur entre parenthèses)
    (Le contenu du tuple "lesfichiers" est constitué de dlls et tlb pris au hasard dans le répertoire system32 de mon poste.)

    ..et ca marche, exemple de sortie:
    msscript.ocx =====> Opération réussie.(0)
    GTDownDE_130.ocx =====> Opération réussie.(0)
    zipo.dll =====> Le module spécifié est introuvable.(126)
    vss_ps.dll =====> Opération réussie.(0)
    stdole2.tlb =====> Opération réussie.(0)

    MAIS, ca ne marche ..pas toujours.

    J'ai parfois des dlls, dont je sais qu'elles sont enregistrables (et qu'un enregistrement manuel via regsvr32.exe enregistre effectivement), qui sont désignées comme ne pouvant pas être enregistrées avec mon code (Le module spécifié est introuvable).

    Help svp.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut [Résolu] Suite et fin
    Bon, finalement j'ai trouvé comment faire (en tout cas j'ai obtenu le résultat que je cherchais).
    Voici le code:
    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
    # -*- coding: cp1252 -*-
    from ctypes import FormatError, GetLastError
    import subprocess
    import os.path
    import sys
     
    lesfichiers = ('c:\\windows\\system32\\msscript.ocx',
              'c:\\windows\\system32\\GTDownDE_130.ocx',
              'c:\\zipo.dll',                                                                                   #Dll inexistante pour tester le comportement du script
              'c:\\windows\\system32\\vss_ps.dll',
              'c:\\windows\\system32\\stdole2.tlb',
              )    
     
    for thefichier in lesfichiers:
            if thefichier[-3:]=='dll' or thefichier[-3:]=='ocx':    #On lit les 3 derniers caractères avec [-3:]
                #Si on a à faire à une dll, ou une ocx
                enr=subprocess.Popen('regsvr32 \"'+thefichier+'\" -s') #L'option "-s" supprime les message provenant de regsvr32.
            else:
                #Si on a à faire à une tlb
                enr=subprocess.Popen('regtlib -q \"'+str(thefichier)+'\"')
            result = enr.wait() #On attend la fin du subprocess pour continuer et on stocke le résultat dans result
            if result==None:    #result=None => L'enregistrement c'est bien déroulé, sinon contient le numéro d'erreur
                result=0
            print os.path.basename(thefichier),'\t:\t'+FormatError(result)+'('+str(result)+')' #impression du résultat (avec n0 d'erreur entre parenthèses)
    En fait, je me compliquais la vie en voulant obtenir les stderr et autre stdout..j'ai lu que la fonction wait() permettais d'attendre la fin du subprocess et de récupérer le code résultat, et hop! le tour est joué.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/05/2009, 14h54
  2. Réponses: 3
    Dernier message: 30/12/2007, 09h11
  3. [DLL] Remplacer des DLL système
    Par tbdarkspirit dans le forum Sécurité
    Réponses: 3
    Dernier message: 21/06/2007, 16h14
  4. Des DLL et des references
    Par Invité dans le forum Visual C++
    Réponses: 2
    Dernier message: 21/04/2007, 10h25
  5. Executable utilisant des DLLs et des LIB
    Par beb30 dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/08/2006, 10h51

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