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

Bases de données Delphi Discussion :

Pb avec processus DLL utilisant ODBC


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 30
    Par défaut Pb avec processus DLL utilisant ODBC
    Bonjour à tous,
    Je vais tâcher d'expliquer clairement mon problème.
    J'ai un service windows développé en Delphi qui inspecte une table.
    Quand il y trouve une ligne, il lance une Dll (développée aussi en Delphi) qui utilise les données pour imprimer une édition Crystal. Une fois l'édition terminée, le service libère la dll et attend la prochaine ligne.
    Mon problème étant que le service qui lance la dll ne meurt pas, et pire, son process monte à 100% de CPU. J'ai pu tracer que c'est au FreeLibrary(dll) que mon service se plante...

    Quelques explications subsidiaires :
    J'ai migré cette Dll d'une connexion SQLinks vers ODBC, en utilisant le même composant BDE : TDataBase. Je précise cela car avec SQLinks, je n'ai pas de souci. Je n'ai le problème qu'avec une version de cette dll qui passe par l'ODBC.

    Mes pistes envisagées :
    Les 2 versions de Dll sont vraiment quasi identique, en tout cas dans leur fermeture, rien n'a changé. L'une fonctionne et pas l'autre.
    Je pense donc que c'est vraiment liée à l'ODBC, ce qui empêche le service de libérer la dll correctement...

    Quelques détails sur mon environnement :
    dll et service développé en Delphi 5
    Base de données : Informix
    Driver de connexion fourni par OLEDB
    Plateforme Windows 2008 server

    Que dire de plus ? J'espère avoir été clair.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Tu arrives à lancer une édition Crystal depuis un Service Windows sous Windows 2008 Server, cela ne pose de problème d'interaction avec le bureau ?

    Tu utilise encore le BDE ? C'est obsolète depuis 10 ans !
    Il faudrait passer en ADO si tu veux exploiter ODBC, ou même un OLEDB en direct, dans un service, tu n'as pas besoin de DataSet et de DBControls, la couche d'accès API sera bien plus performante !

    as-tu fourni une session à ton service via SC.exe ?
    Le comportement du Service change vraiment entre mode SYSTEM et un mode SESSION

    tient un sujet de fulster, un ancien collègue qui avait eu ce problème
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 30
    Par défaut
    Je suis précisément en pleine migration BDE vers ADO. Et cette dll fait partie de la prochaine étape.
    Mais dans l'attente, pour la compatibilité, j'ai migré cette dll en ODBC.
    Le service n'a pas de composant Dataset ou DBControls. Il lance la dll avec des paramètres, qui elle, contient les composants.
    Et oui, le service est lancé en mode session. Sur celle de l'administrateur qui plus est. Donc à priori, pas de souci de droit d'accès...

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par Slyteck Voir le message
    Mais dans l'attente, pour la compatibilité, j'ai migré cette dll en ODBC.
    C'est quoi en ODBC ? Tu veux dire utilisation directe avec OLEDB ?

    Pense au Coinitialize et CoUninitialize si tu utilises des objets COM de l'ODBC, ces fonctions devant être lancer dans le LoadLibrary et FreeLibrary !

    J'ai récemment développé des DLL, plus en 1 an qu'en 10, j'ai constaté des problèmes liés aux Threads lancés DANS une DLL (ou sous DLL en liaison statique C++Builder), il semble que soit préférable de les arrêter avant le FreeLibrary, d'ailleurs bcp de DLL tiers fonctionne aussi avec des fonctions Initialize et Cleanup, j'ai procéder de la même façon !
    J'avais comme toi, une consommation processeurs ou une sorte de DeadLock, les threads ayant du mal a s'arrêter !
    Par contre, l'appelant était un EXE !

    Je parle bien de threads créés dans la DLL, j'avais plutôt pratiquer des thread créés dans l'EXE utilisant simultanément la même DLL, là il n'y a pas de problème !

    Sous Server 2008, même avec un mode SESSION, j'ai constaté de grosse limitation sur l'interactivité avec le bureau par exemple (ShellExecute ou CreateProcess)

    Tu es en 32 ou 64Bits ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 30
    Par défaut
    Le driver que j'utilise est le suivant : IBM INFORMIX ODBC DRIVER (fourni par OLEDB).

    Et pour répondre à ta dernière question je suis en 32bits, mais le 64 n'est pas très loin dans le planning... :-)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 30
    Par défaut
    Me revoilà ! Et je viens apporter des précisions sur mon problème, puisque ce n'est pas exclusivement lié au fait de passer par un service.

    J'ai un EXE (développé en Delphi) qui utilise la même dll. Et je viens de me rendre compte que là aussi, cela plante sur les FreeLibrary de cette dll.

    Vous me direz, mais pourquoi tu ne l'as pas vu avant ? Tout simplement parce que les Freelibrary avaient été oublié !

    Je pose donc la question (bien que j'ai vu un autre sujet là-dessus) : les FreeLibrary sont-ils si indispensables que ça ?
    Car en débugant, j'ai constaté que toutes les procédures Destroy de ma dll s'exécute complètement...

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/07/2010, 01h41
  2. utilisation de static avec une DLL !
    Par Mike91 dans le forum MFC
    Réponses: 5
    Dernier message: 10/01/2008, 12h54
  3. dll utilisable avec VBAccess 97
    Par Mü dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 10/02/2005, 15h45
  4. Réponses: 12
    Dernier message: 02/02/2004, 13h41

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