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++Builder Discussion :

LoadLibrary avec C++ Builder 6 sous Windows 2000


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut LoadLibrary avec C++ Builder 6 sous Windows 2000
    Bonjour,

    Vous pouvez peut-etre m'aider ...
    Je viens d'ecrire une application professionelle avec BCB 6 Entreprise.
    Application en VCL compilée en mode static (pas de RunTime) avec conservation des gestionnaires d'exception...

    Si je fais un LoadLibrary d'une DLL pour laquelle il manque une ressource DLL statique, j'ai un message d'erreur remonté par le gestionnaire d'exception de l'application (impossible de charger xxxxx.dll, introuvable dans le path: .............) uniquement sous Windows 2000 (pas sous 95, 98, non teste sous NT4 et XP).
    J'aimerais ne pas voir s'afficher cette erreur.

    Ayant développé des applications sous Borland C++ 5.02, Microsoft Visual C++ 5.0 et 6.0, Microsoft Visual Basic 4.0 qui font le meme type de chargement dynamique, je n'ai pas ce message d'erreur sous Windows 2000.

    J'ai essayé une solution du style:
    MyApplication (BCB6) linker avec MyResource.Dll (BC++5.02) qui fait un LoadLibrary -> resultat identique sous Windows 2000.

    Que se passe-t-il ? Pourquoi ? Comment passer outre ?

    Il existe une fonction exportée et automatiquement créée lors de la compilation de l'application en VCL qui est __GetExceptDLLInfo ....
    Est-ce elle qui gere ce type de message ?

    Merci pour votre aide et votre réponse.
    Cordialement Thomas

  2. #2
    Membre régulier
    Avatar de bebeours
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 103
    Points : 123
    Points
    123
    Par défaut
    Tu places bien tes DLL dans le répertoire de l'application ?

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut LoadLibrary C++ Builder 6
    Le but est d'avoir un handler de ressources DLL et de charger uniquement celles qui sont chargeables. Il y en a une vingtaine mais seulement certaines seront utilisees par l'application. Mon probleme est de ne pas voir le message systeme "DLL introuvable ... avec path ..." a l'ecran. Cette application tournant en flux tendu dans une usine de production, il est hors de question d'avoir un message bloquant l'application et donc de bloquer les productions en cours.

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    j'ai pas vraiment bien compris la question

    Charge tu dynamiquement une DLL avec l'API Win32 LoadLibrary :
    ou bien Statiquement par le loader de l'application via une Librarie Statique :

    Dans le premier cas si ta Dll n'est pas trouvée LoadLibrary te retourne NULL

    dans le second cas si c'est dans le loader de l'écécutable alors tu ne peux rien faire car ton application refusera de démarrer

    Cordialement

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut LoadLibrary avec C++ Builder 6 sous Windows 2000
    Pour etre plus claire (si j'y arrive), je voudrais utiliser le LoadLibrary de l'api 32 QUI PLANTE AVEC retour NULL (pour info, il peut y avoir des valeurs d'erreur de retour inferieure a 32) mais sans voir apparaitre a l'ecran le message systeme (DLL Introuvable .... path ....) sous Windows 2000 et XP.
    Ce message ne s'affiche pas sous Windows 95, 98, Me et NT4.

  6. #6
    Membre régulier

    Inscrit en
    Janvier 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 38
    Points : 76
    Points
    76
    Par défaut
    avec un try ... catch ça ne fonctionne pas non plus ?

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut LoadLibrary avec C++ Builder 6 sous Windows 2000
    Alors, je ne sais pas ....

    MessageBox( "Begin" )
    h = LoadLibrary(sMyResource)
    MessageBox( "End " + h )

    1. Begin s'affiche
    2. La fameuse boîte système (DLL Introuvable ... path ...) s'affiche
    3. End NULL s'affiche

    Où dois-je donc mettre le try ... catch ... et quelle exception ... ?

    Existerait-il un option (style base de registre) à activer pour supprimer cette boîte système ?

    Pour Info, sur Windows 2000 et XP les fonctions LoadLibraryA et LoadLibraryExA sont redirigées de Kernel32 vers NTDLL.DLL (les nouvelles fonctions sont prefixées par Ldr...., c'est passionant !!!)

    Je pense que mon probleme vient de la façon dont est exécuté le l'application (le processus principal) voir comment elle a été compilée.
    En effet avec Visual Basic 4 (32 bits) je n'ai pas ce message systeme.
    Avec Borland C++ 5.02 et Borland C++ Builder 6, je l'ai ....

  8. #8
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    :o :o
    tu raconte n'importqe quoi
    LoadLibrary est une API windows implémentée dans la DLL Kernel32
    que ce soit sous win95,98,nt,2000,XP
    si tu a une message Box c'est que tu charge statiquement les librairies
    en principe on utilise LoadLibrary en conjonction avec GetprocAdress
    j'ai essyé de chargé une dll qui n'existe pas avec LoadLibrary
    simplement le retour de l'api retoune NULL

    Cordialement

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Le 'Tu racontes n'importe quoi' me semble un peu de trop....
    Cela fait 12 ans que je (ou que j'ai) developpé sous les differents Windows de Microsoft (3.0, 3.1, 3.11, 95, 98, Me, Nt3.51, Nt4 et depuis peu 2000 ) ....

    Si les articles TECHNIQUES ne vous font pas peur, voici un lien fort interessant a propos de la redirection de certaines fonctions du KERNEL sur NTDLL: Windows 2000 Loader, What Goes On Inside Windows 2000: Solving the Mysteries of the Loader - Russ Osterlund
    http://msdn.microsoft.com/msdnmag/issues/02/03/Loader/default.aspx

    Pour en revenir a mon probleme:

    1. APPLI.EXE faisant un LoadLibrary de RESSOURCE.DLL
    2. RESSOURCE.DLL linker statiquement avec TRUC.DLL
    3. Suppression de TRUC.DLL
    4. Lancement de APPLI.EXE
    5. Lors du LoadLibrary, j'ai mon fameux message systeme.

    Si quelqu'un pouvait me donner un solution intelligente pour supprimer cette boite de confirmation, cela serai super sympa.

    Merci a tous.

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    j'ai utilisé la procédure de test suivante
    un excécutable charge dynamiquement une DLL qui a chargé elle de manière statique une autre DLL
    Résultat sous NT (4 ou 5) je n'ai plus la 3.51

    Message Box du système d'explotation"DLl Non Trouvée dans le chemin"
    après l'appel à LoadLibrary

    2 solutions possibles:
    1 installer toutes les DLL dans le répertoire system32 ou vue par le <path>
    2 pas de chargement statique dans les DLL ,uniquement du dynamique

    Cordialement

  11. #11
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour l'example, c'est exactement le probleme que j'ai.
    Ce qui m'intrigue le plus, c'est qu'en Visual Basic 4 (32 bits), je n'ai pas cette boite de dialogue en faisant exactement la meme chose. J'ai par contre la possibilite de recuperer l'erreur avec les fameuse exception a la VB
    (On Error Goto Label .... Label: MsgBox Err.Number & Err.Description)
    qui me signale une erreur 53: Fichier introuvable ...

    J'ai trouvé sur le site de Microsoft un article le Run-Time Dynamic Linking:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/run_time_dynamic_linking.asp
    et une variante sur le Load-Time Dynamic Linking:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/load_time_dynamic_linking.asp

    Bref, toujours pas de solution...
    Cordialement, Thomas

  12. #12
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Je ne sais pas si j'ai tout suivi mais si tu testais si la .dll existe avant de vouloir la charger ?

    Cordialement,

  13. #13
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Au sujet de mon probleme de message intempestif, j'ai mis en oeuvre une recherche de dependances avant de faire le LoadLibrary.

    Il y a un eu un article de 1997 qui explique comment retrouver les dependances chargeables ou non:
    http://www.microsoft.com/msj/0297/hood/hood0297.aspx

    Par contre, utiliser cette methode systematiquement avant un chargement dynamique d'une DLL prend du temps, surtout si l'application est située sur un serveur dont la bande passante est faible...

    Enfin, si quelqu'un a une solution autre, merci de son aide.
    Thomas

  14. #14
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    j'ai trouvé une solution élégante a ce problème
    il suffit de dire a Win32 que le traitement des erreurs est traité par le programme utilisateur
    pour ce faire utilise l'appel à SetErrorMode
    dans l'exemple suivante
    je charge dynamiquement une DLL(projecz2.dll) qui elle importe une fonction de manière statique se trouvant dans une autre DLL

    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
     
    SetErrorMode(SEM_FAILCRITICALERRORS|
                        SEM_NOOPENFILEERRORBOX); //Programme Utilisateur gère les exceptions
       bool result;
       HINSTANCE mlib;
       try
        {
         mlib=LoadLibrary("project2.dll"); // chargement dynamique de la dll
         if(!mlib)RaiseLastWin32Error();// Erreur --> Génération d'une exception
        }
        catch(EWin32Error&E)
        {
         Label1->Caption=E.Message;// traitement de l'exception
         SetErrorMode(0);// win32 gère les erreurs systèmes
         return;
        }
        try
        {
         mboolfnct* toto =(mboolfnct*)GetProcAddress(mlib,"_tam");// chargement de la fonction importée de la DLL
         if (toto)result= toto();// OK --> appel de la fonction
         else  RaiseLastWin32Error();-->Erreur --> génération exception
        }
        catch(EWin32Error&E)
        {
         Label1->Caption=E.Message;// traitement de l'exception
         FreeLibrary(mlib);// libération de la DLL
         SetErrorMode(0);// win32 gère les erreurs systèmes
         return;
        }
       if(result)Label1->Caption="Imported DLL Function Executed Successfuly";
       SetErrorMode(0);// win32 gère les erreurs systèmes
    cordialement

  15. #15
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    encore une petite précision
    si tu utilise C++Builder 6
    il faut remplacer l'exception
    EWin32Error par EOSError
    ainsi que l'appel au déclenchement de l'exception
    RaiseLastWin32Error() par RaiseLastOSError()

    cordialement

  16. #16
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ton aide.
    Plus qu'a tester sur mon projet.
    Cordialement Thomas.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/11/2010, 10h23
  2. Linker une appli en C++Builder 6, sous Window
    Par toni dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/12/2004, 09h04
  3. Installation Oracle 10g sous Windows 2000
    Par Jeff206 dans le forum Oracle
    Réponses: 6
    Dernier message: 24/08/2004, 15h51
  4. [Débutant] Problème d'installation sous Windows 2000
    Par bavmorda dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 04/08/2004, 16h28
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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