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

Connexion aux bases de données Firebird Discussion :

répertoire pour FBCLIENT.DLL


Sujet :

Connexion aux bases de données Firebird

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    839
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut répertoire pour FBCLIENT.DLL
    bonjour,

    Je developpe des applications 32 bit avec delphi et FB2.1.3
    La liaison aux bases se fait avec les IBX qui pointe directement dans \system32 pour charger FBCLIENT.DLL (en fait GDS32.DLL je crois pour les IBX))

    je viens de m'apercevoir , par hazard, que sur un poste 64 bit, les versions de DLL installé dans \system32 est celle en 64 bit.
    La version 32 bit des DLL est dans \SYSWOW64

    Du coup , mon appli 32 bit utilise par défaut la DLL en 64 bit !!
    Tout fonctionne bien , mais est ce que cela pourrait poser problème ?

    D'une manière générale, comment bien gérer le chemin d'accès à la DLL ?
    Mettre du code dans le prog pour identifier si le poste est en 32 bit ou 64 bit puis orienter sur le bon chemin ?
    Mettre manuellement la bonne DLL dans le repertoire de l'executable ?
    J'avais pensé au départ pointer sur la DLL qui est installé avec Firebird, mais même problème, suivant le cas ce n'est pas dans le même répertoire. (programmes ou program files (x86))

    Surtout que je vais passer aux IBDAC , et là, j'ai vu qu'il fallait mettre le chemin dans le composant de connexion .

    Quels conseils pourriez vous me donner ?

    cordialement

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par looping Voir le message
    Je developpe des applications 32 bit avec delphi et FB2.1.3
    La liaison aux bases se fait avec les IBX qui pointe directement dans \system32 pour charger FBCLIENT.DLL (en fait GDS32.DLL je crois pour les IBX))

    je viens de m'apercevoir , par hazard, que sur un poste 64 bit, les versions de DLL installé dans \system32 est celle en 64 bit.
    La version 32 bit des DLL est dans \SYSWOW64

    Du coup , mon appli 32 bit utilise par défaut la DLL en 64 bit !!
    Ce n'est basiquement pas possible...
    Certains sont parvenus à faire communiquer une application 32 bits avec une dll 64 bits au prix de nombreuses contorsions (en lançant un process 64 bits et en communiquant avec des messages et des fichiers mappés en mémoire).
    http://blog.synopse.info/post/2011/0...32-bit-process
    http://cc.embarcadero.com/Item/27667

    Citation Envoyé par looping Voir le message
    Tout fonctionne bien , mais est ce que cela pourrait poser problème ?
    Car c'est votre dll 32 bits qui est appelé , le SE se charge d'aller chercher la bonne dll, celle qui correspond à votre application...

    Citation Envoyé par looping Voir le message
    D'une manière générale, comment bien gérer le chemin d'accès à la DLL ?
    Mettre du code dans le prog pour identifier si le poste est en 32 bit ou 64 bit puis orienter sur le bon chemin ?
    Mettre manuellement la bonne DLL dans le repertoire de l'executable ?
    J'avais pensé au départ pointer sur la DLL qui est installé avec Firebird, mais même problème, suivant le cas ce n'est pas dans le même répertoire. (programmes ou program files (x86))

    Surtout que je vais passer aux IBDAC , et là, j'ai vu qu'il fallait mettre le chemin dans le composant de connexion .

    Quels conseils pourriez vous me donner ?
    S'assurer que le pilote nécessaire à votre application est installé dans sa bonne déclinaison et que les dll de celui ci sont placées dans un chemin défini dans la variable PATH, les répertoires systèmes, ou le répertoire de l'application...
    Philippe.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Je croyais avoir répondu à ce post , mais , a force de faire plusieurs choses en même temps j'ai du fermer le web browser avant de cliquer sur le boutons envoi

    Pour en revenir à GDS32.dll , lors d'une installation "normale" de Firebird (ici je parle de la version 64 bits sur bien sur un OS 64 bits [windows]) .
    si les cases à cocher lors de l'installation copier la bibliothèque dans le répertoire système et générer gds32.dll ont été cochés , j'ai eu la curiosité d'aller voir ce qui se passe au niveau des 2 répertoires
    system32
    - fbclient.dll taille 854 K
    - gds32.dll taille 854 K
    SysWow64
    - fbclient.dll taille 540 K
    - gds32.dll taille 540 K
    Comme tu le constates , les tailles sont différentes en gros je dirais : 854K = 64 Bits 540K = 32 bits


    Tout fonctionne bien , mais est ce que cela pourrait poser problème ?
    Car c'est votre dll 32 bits qui est appelé , le SE se charge d'aller chercher la bonne dll, celle qui correspond à votre application...
    tout est dit ,pour un programme Delphi 32 bits c'est celle de SYSWOW64 (je me ferais jamais a ces noms Microsoft !!) qui sera utilisée

    Que faire maintenant quand on indique spécifiquement un chemin ?
    réponse de normand " si on indique un chemin , c'est que l'on est conscient de ce que l'on fait " et de Ph.B.
    réponse de curieux " voir comment l'équipe zeos s'en sort pour trouver les chemins selon un protocole "
    j'avoue avoir essayé , j'en suis resté à la lecture de ZPlainLoader.pas (Windows)+Zcompatibility.pas (pour Linux) après être passé par ZplainFirebirdDriver.pas et je butte là par manque de temps , je ne comprend pas comment ils répertorient les 'locations' dans ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor TZNativeLibraryLoader.Create(Locations: array of string);
    var
      I: Integer;
    begin
      SetLength(FLocations, Length(Locations));
      for I := 0 to High(Locations) do
        FLocations[I] := Locations[I]; 
      FHandle := INVALID_HANDLE_VALUE;
      FCurrentLocation := '';
      FLoaded := False;
    end;
    peut être en analysant le path ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    839
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut ibdac
    Bonjour,

    Le point de départ de mon interrogation vient du fait qu'avec les compo de connexion IBDAC, il faut indiquer un chemin de la librairie , alors qu'avec les IBX c'était automatique.

    Nom : ib.jpg
Affichages : 474
Taille : 11,8 Ko

    Comme le montre l'image, j'avais choisi de pointer sur la librairie de firebird.
    Mais cela ne fonctionne pas car ce n'est pas le même chemin en 64 bit.

    Est ce qu'il y a un moyen de détecter si un poste est en 32 ou 64 bit ?
    Il suffira ensuite de coder le chemin par rapport à cela.

    Cordialement

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par looping Voir le message
    Comme le montre l'image, j'avais choisi de pointer sur la librairie de firebird.
    Mais cela ne fonctionne pas car ce n'est pas le même chemin en 64 bit.
    La dll est chargée via un appel à LoadLibrary qui accepte un nom de dll sans chemin pour peu qu'elle se trouve dans un des emplacements que j'ai spécifié auparavant (Système, PATH, répertoire courant).
    Avez vous essayé en spécifiant seulement le nom ?

    Citation Envoyé par looping Voir le message
    Est ce qu'il y a un moyen de détecter si un poste est en 32 ou 64 bit ?
    Il suffira ensuite de coder le chemin par rapport à cela.
    Vous pouvez appeler la fonction GetSystemInfo de l'API Win32. La structure SYSTEM_INFO qui est renvoyée contient un champ wProcessorArchitecture qui indique s'il s'agit d'un SE 32 ou 64 bits.
    Philippe.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    839
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 839
    Points : 262
    Points
    262
    Par défaut retour d'info
    bonjour,

    je me suis aperçu que la propriété du chemin de bibliothèque était aussi en lecture.

    j'ai donc essayé les 2 cas suivants en faisant une lecture de la chaine de connexion:

    - 1er cas : je ne mets rien, donc chaine vide. la connexion fonctionne et la lecture donne "gds32.dll"

    - 2ème cas: je mets "fbclient.dll" sans préciser de chemin. La connexion fonctionne et la lecture donne "fbclient.dll"
    Partant de ce constat, j'ai modifié temporairement le nom de "fblient.dll" dans \system32 ....et la connexion plante.

    Donc vous aviez raison: le composant va chercher la librairy dans \system32.
    J'ai ensuite essayé sur un poste en 64 bit, et même conclusion que ci dessus: le composant va chercher la librairy dans \syswow64; donc bien celle en 32 bit

    Conclusion: je vais parametré tous mes compo de connexion sur fbclient.dll et la liaison se fera automatiquement sur la bonne librairy quelque soit le système 32 ou 64 bit.

    A+

Discussions similaires

  1. fbclient.dll o gds32.dll pour win CE
    Par endaco dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 01/10/2011, 01h39
  2. Répertoire courant pour une DLL
    Par jaduta dans le forum Delphi
    Réponses: 2
    Dernier message: 02/04/2007, 09h10
  3. Sécuriser un répertoire via une DLL
    Par kazarn dans le forum MFC
    Réponses: 2
    Dernier message: 05/03/2005, 17h33
  4. result: chaine de caractère pour une DLL
    Par Sephiroth Lune dans le forum Langage
    Réponses: 7
    Dernier message: 27/07/2004, 23h05
  5. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07

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