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

Langage Delphi Discussion :

DLL refuse le chargement par plusieurs jobs


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut DLL refuse le chargement par plusieurs jobs
    Contexte :
    Poste client : Windows 10 21H2
    Poste serveur : Windows Server 2016
    Delphi XE7

    Je lance depuis mon poste client deux jobs sur le serveur qui :
    .lancent un exécutable
    .cet exécutable charge dynamiquement une DLL

    Les traitements sont abondamment tracés

    J'observe que la DLL
    est bien chargée par l'exécutable lancé dans le premier job
    n'est pas chargée par l'exécutable lancé dans le second job (GetLastError renvoie 126)

    j'ai vu un article MS qui traite d'un sujet voisin
    lié aux droits d'accès des jobs sur les DLL mais le fait est que je n'ai pas de problème avec le premier job

    voilà si cela parle à quelqu'un....

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 510
    Points : 2 782
    Points
    2 782
    Billets dans le blog
    10
    Par défaut
    Sans garanties (et éventuellement si tu peux regénérer ta DLL) en faire un copie sous un autre nom car le 1er chargement bloque le fichier DLL le temps de son utilisation

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 712
    Points : 25 598
    Points
    25 598
    Par défaut
    ERROR_MOD_NOT_FOUND

    126 (0x7E)

    Le module spécifié est introuvable.


    As-tu un Process Attach ou Thread attach dans le Main de la DLL ?

    As-tu un cloisonnement mémoire des variables mémoires, est-ce le process partage son gestionnaire de mémoire ?

  4. #4
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    La DLL (codée en C++) charge des librairies de l'environnement scientifique SCILAB.

    Hier l'ensemble des éléments de l'installation SCILAB résidait sur le disque local du serveur.

    Aujourd'hui j'ai tenté de charger une installation SCILAB faite sur un disque réseau (auquel j'accède depuis
    mon poste client et depuis le poste serveur) à partir du Job n°2 et désormais la DLL est chargée
    correctement par tous les jobs !

    L'article référencé dans mon premier post est relatif à l'erreur STATUS_DLL_NOT_FOUND (différence de celle
    que j'ai eue) mais je me demandais si mon problème n'était pas lié à des histoires de droits d'accès...

    Cet article fournit une solution de contournement pour un problème où la fonction LoadLibrary retourne STATUS_DLL_NOT_FOUND erreur sur le thread d’emprunt d’identité dans Windows.

    S’applique à : Windows Server 2019, Windows Server 2016, Windows 10 - toutes les éditions

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 712
    Points : 25 598
    Points
    25 598
    Par défaut
    En réseau, déjà que les Exe en Citrix en réseau cela crée des copies mémoire, des verrous sur le fichier ... ça va être peu fiable comme méthode car le temps d'accès réseau est lent par rapport à un accès local.

    En Citrix, c'est comme un bureau à distance, mais c'est encore pire un Exe sur un poste A avec une DLL sur poste B, je devine une installation centralisé pour simplifier le déploiement et peut-être économiser des licences.

    La DLL étant codé en C++, elle utilise donc son propre gestionnaire de mémoire, et es-tu sûr que cette utilisation est prévue, autorisée voire pas empêché ?
    Tu peux très bien codé qu'un seul process s'attache à la DLL, même un seul thread à la fois.


    Comment montes-tu le disque ?
    Genre un WNetAddConnection1, 2 ou 3 ?

    Si cette technique corrige le problème, surement parce qu'il fait plusieurs copies mémoire de la DLL issue du réseau au lieu d'un seul exemplaire de la DLL locale partagée par plusieurs process.

  6. #6
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    -La direction informatique de notre organisation met en place et gère les disques réseau.
    -Les jobs sont lancés à travers le client MS : HPC Pack 2016 Job Manager.
    -lorsque j'exécute l'application sur mon poste , avec chargement de la DLL et lancement du Scilab à la suite, l'ensemble fonctionne convenablement.
    -Actuellement l'ensemble (EXE et DLLs) est en WIN64.
    -Aucune licence payante n'est nécessaire ni sur l'exe ni sur cette version Scilab (5.4.1)

    -j'ai refait de nombreux tests hier en essayant de charger alternativement une première puis une deuxième installation Scilab selon la parité du numéro de job : les résultats sont très erratiques

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 446
    Points : 5 867
    Points
    5 867
    Par défaut
    Salut

    peut tu faire des logs sur les path utilisé
    il manque peut être une information sur scilab

  8. #8
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 73
    Points
    73
    Par défaut
    Je viens de refaire un test avec huit jobs qui référencent alternativement deux installations différentes de Scilab sur deux disques réseau différents et ça fonctionne bien.

    Merci de vos conseils et avis.

    Je clos la discussion.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2012, 10h06
  2. [JNI] chargement de plusieur Dll
    Par thibal_kamehouse dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 13/10/2006, 11h49
  3. Partage de code par plusieurs instances
    Par a.tintin dans le forum MFC
    Réponses: 3
    Dernier message: 08/08/2005, 15h03
  4. Réponses: 9
    Dernier message: 17/04/2004, 17h32
  5. [DLL] -> Retarder le chargement ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/08/2003, 21h32

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