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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 �prouv�
    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
    Par d�faut
    Tu places bien tes DLL dans le r�pertoire de l'application ?

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 Expert
    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
    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
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 averti

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

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 Expert
    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
    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
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 Expert
    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
    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
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    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
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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 Expert
    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
    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
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  15. #15
    Membre Expert
    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
    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
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  16. #16
    Membre du Club
    Inscrit en
    Novembre 2003
    Messages
    9
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    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