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

Autres éditeurs Discussion :

Chargement dynamique de DLL sous Unix


Sujet :

Autres éditeurs

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Chargement dynamique de DLL sous Unix
    Bonjour

    Je mets en place un environnement multi-SGBD supposé s'interfacer avec le bon client SGBD en fonction d'un fichier de config
    J'ai donc une DLL qui utilise soit les services de ma DLL Sybase (qui utilise un client Sybase) soit les services de ma DLL Oracle (qui utilise un client Oracle)

    Je souhaite donc que ne soit chargée que la DLL correspondant au contexte SGBD afin de ne pas avoir d'erreur de lien non résolu (avec le clien SGBD) pour l'environnement SGBD non utilisé qui m'obligerait à avoir une DLL bouchon avec les risque de boulettes qui l'accompagne en termes de livraison client

    Je voudrais donc mettre en oeuvre un chargement de librairie en dynamique en C sous Unix ? J'aimerais que mon traitement ne charge une dll que lorsqu'il en a besoin et surtout pas avant... Typiquement il s'agit de charger le client Oracle ou le client Sybase mais jamais les deux...

    En l'état mon makefile comporte une ligne du type : cc -G -brtl -blazy ...... mais cela ne semble pas toujours suffisant ....

    Help me please

    D'avance merci
    Willou

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    je ne vois pas trop le probleme. dans ton Makefile, il suffit de compiler la dll que tu veux. ensuite tu utilise la variable LD_LIBRARY_PATH.

    explique mieux ton probleme.

    P.S : utilise plutot gcc avec -fPICS pour la compilation des .c et -shared pour la création de la dll

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Chargement dynamique de DLL C sous Unix
    En fait j'ai une DLL pour faire simple qui s'appelle SQL et qui fait office d'interface. J'ai ensuite une DLL qui s'appelle SYB et une ORA et chacune contient des ordres spécifiques d'accès à mon SGBD
    Dans mes traitements, j'utilise par ex. une T_SQL_EXECPROCSTOCK qui se trouve dans SQL et qui invoque la fonction T_SYB_EXECPROCSTOCK ou la T_ORA_EXECPROCSTOCK selon que la propriété TYPE_SGBD de mon fichier INI vaut SYBASE ou ORACLE
    Etant donné que ma SQL est linkée avec ma SYB et ma ORA, elles mêmes linkées avec des services de leur client respectif, au chargement de ma SQL il y a chargement de ma ORA et de ma SYB avec résolution des lients avec les clients qui vont bien
    Si celà ne me pose pas de pb vu que j'ai les deux, mes clients eux n'ont que l'un des SGBD et donc je voudrais que les DLL SYB et ORA ne soient chargées que lorsqu'on invoque un de leurs services. Etant donné que pour un client sous SYBASE ma SQL ne redirigera que vers la DLL SYB, il ne cherchera pas à charger la ORA et je n'aurai pas de lien non résolu
    J'avais cru comprendre que l'option LAZY de CC permettait de conditionner le chargement d'une DLL à son utilisation effective mais celà ne semble pas super bien marcher
    Merci

  4. #4
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    et pourquoi ne pas charger les deux ?
    une autre possibilité : compiler que la dll que tu veux

    mais je vois vraiment pas. tu me dis que tu veux qu'il charge la dll qui est utile au cleint entre les deux par le fichier .ini. Mais si tu as compiler les deux, il va avoir besoin des deux et si les lib sont dans un rep pour ld. bah il va charger les deux.

    Peut étre que ld charge les libs selon le besoin mais je n'en suis pas sur du tout. Franchement tu t'emmerdes pour rien. Autant qu'il charge les deux librairies. Ce n'est pas trés grave.

    et tu ne pourras rien faire car il va essayer de charger les dll. donc c'est au niveau de la compilation qu'il faut faire son choix. Ou compiler les deux pour avoir le choix par la suite.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Chargement dyn de DLL sous Unix
    Je ne peux pas charger les deux car mes SYB et ORA utilisant des services client Sybase ou Oracle, celà obligerait mes clients à avoir un runtime Sybase et un Oracle

    Je ne veux pas non plus linker avec l'une ou l'autre car on doit déjà gérer la livraison des binaires pour AIX, SUN... et on ne veux pas rajouter une dimension à la gestion paralèlle des livraisons (AIX/ORA, AIX/SYB, SUN/ORA...) car à coup sûr une fois sur deux on livrera une mauvaise version à qqu'un

    Je linke effectivement ma SQL avec ma SYB et ma ORA mais j'ai lu qu'il était possible au chargement d'un programme de ne charger une DLL que lorsqu'on cherchait à s'en servir. Comme chez un client donné, le fichier INI fera que ma SQL ne cherchera à utiliser que les services SYB (par ex.), il ne chargera pas la ORA et donc ne gueulera pas parce que mon client n'a pas de client (SGBD) ORA

    U6 Watt Aïl Mine ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 104
    Points : 128
    Points
    128
    Par défaut
    bonjour,

    si j'ai bien compris tu écris une dll...tes sources font appel à deux types de fonctions (externe a la lib) : sybase ou oracle. Et ces appels sont "en dure" dans les source de ta dll. Et tu ne veux pas charger les 2 en meme temps et tu ne veux pas que ca gueule ?

    je te répondrai que ds ce cas que la seul méthode que je connaisse est d'utiliser dlopen(), dlsym....

    j'espère que cette solution de conviendra, sinon bonne chance

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Je n'ai pas tout lu (honte sur moi !)

    mais ce que tu veux faire ressemble furieusement au fonctionnement de ODBC !

    En ODBC tu link ton appli avec la lib ODBC manager (archive ou shared peut importe, meme si generalement se sont des shared MS oblige).

    ensuite au moment ou tu te connecte à une base, tu donne sont identifiant que ODBC manager utilise pour trouver les caracteristiques de la base : (nom+driver).

    Le driver est une shared lib qui contient des fonction dont les noms sont definis a l'avance, et sont les memes pour tous les drivers...

    ODBC manager charge donc cette shared explicitement (sload, LoadLibrary etc en fct su systeme) puis recupere des pointeurs sur chacune des fonctions...

    Ainsi il est facile de faire de nouveaux drivers sans avoir a recompiler l'application ou plutot le ODBC Manager, il est egalement facile d'avoir plusieurs drivers actifs en meme temps (un jeu de pointeurs pour chaque driver)...

    Voilà en espererant avoir repondu a ta question...

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Chargement DLL dynamique sous Unix (suite et fin)
    Nous avons effectivement pu résoudre notre pb avec DLOPEN et DLSYM
    Maintenant C tout bon, mon interface SQL (qui pourrait effectivement être vue comme un driver ODBC) ne cherche pas à charger un runtime ORACLE quand elle est en environnement SYBASE et vice et versa

    Merci à tous pour vos précieux conseils

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/05/2013, 09h09
  2. Chargement dynamique de dll
    Par funtix dans le forum Caml
    Réponses: 8
    Dernier message: 27/12/2007, 00h03
  3. Réponses: 5
    Dernier message: 04/02/2007, 11h15
  4. [VB.NET] Chargement dynamique des dlls de l'application
    Par leSeb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/01/2006, 17h49
  5. [MFC VC.NET] Chargement dynamique de DLL
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 26/01/2005, 13h56

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