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

API, COM et SDKs Delphi Discussion :

Reconnecter les lecteurs réseaux


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut Reconnecter les lecteurs réseaux
    Bonjour,

    Dans certains cas Windows XP ne reconnecte pas les lecteurs réseaux déclarés, et donc mes programmes qui veulent accéder aux fichiers qui s'y trouvent bloquent betement là dessus.
    Il suffit quand ça arrive de lancer l'explorateur Windows, d'ouvrir le partage, et magie il se reconnecte.

    J'ai trouvé la fonction WNetRestoreConnectionW (doc API) de l'API Windows qui semble correspondre, et j'ai écris ça (comme elle n'est pas dans Windows.pas alors que d'autres de la même lib y sont)
    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
    interface
     
    uses Windows;
     
    procedure RestaureConnexionsReseau;
     
    {$EXTERNALSYM WNetRestoreConnectionW}
    function WNetRestoreConnectionW(hwndParent : HWND; lpDevice : PWideChar; fUseUI: Boolean): DWORD; stdcall;
     
    implementation
     
    function WNetRestoreConnectionW; external mpr name 'WNetRestoreConnectionW';
     
    procedure RestaureConnexionsReseau;
    var
      Result : Word;
    begin
      Result:=WNetRestoreConnectionW(0, Nil, True);
      end;
    Ca semble marcher, si je remplace le NIL par "Z:" il m'annonce que Z: est déjà connecté. Mais dans tous les cas, il plante ("Exception EExternalException dans le module... Exception externe C000001E").
    Qu'est-ce que j'utilise mal? Je n'ai pas trop l'habitude des API Windows, j'ai donc copié sur l'interface définie dans Windows.pas en comparant avec la doc M$.

    A défaut il semble qu'un NET USE puisse marcher, mais d'un ça fait moyen propre je trouve les exec quand on peut utiliser les API, et de deux j'aimerai comprendre pour la prochaine fois que j'utilise l'API Windows.

    Merci
    Cédric

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    bonjour,

    Je viens d'aller jeter un oeil sur la documentatio de WNetRestoreConnectionW() et la page de description commence par un avertissement déconseillant de l'utiliser.

    De plus, vous dites que l'utilisation de la commande NET USE permet d'obtenir le résultat désiré.

    Il serait peut être intéressant pour vous de regarder du côté de la fonction WNetUseConnection().


    devYan.

  3. #3
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Fait plutot une recherche sur cet fonction windows : WNetAddConnection2
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    Je viens d'aller jeter un oeil sur la documentatio de WNetRestoreConnectionW() et la page de description commence par un avertissement déconseillant de l'utiliser.
    Ils déconseillent nulle part de l'utiliser, ils préviennent qu'elle n'est garantie que sur 2000 et XP. Ca tombe bien, il n'existe rien d'autre pour le moment pour moi, et Vista n'existera pas non plus vu mon besoin. Je travaille pour un marché captif, mon logiciel ne peut être installé que par moi ou un collègue, donc aucun problème avec ça.
    Ou alors on ne parle pas de la même doc.

    De plus, vous dites que l'utilisation de la commande NET USE permet d'obtenir le résultat désiré.
    Oui, avec un ShellExecute, ce que je trouve pas très propre si une API permet de le faire.

    Il serait peut être intéressant pour vous de regarder du côté de la fonction WNetUseConnection().
    Elle sert à créer une connexion, si je lis bien. Or les connexions existent, elles sont juste pas réveillées. Et comme mon programme n'est pas le seul à les utiliser, il serait incohérent qu'il les détruise et les recréé (question de cohérence et de responsabilité des programmes).

    Citation Envoyé par Guile
    Fait plutot une recherche sur cet fonction windows : WNetAddConnection2
    Même remarque, je ne veux pas créer de connexion. Notamment ce n'est pas mon programme qui connait les mots de passe.

    A moins que ce ne soit la seule méthode qui marche, voire officielement recommandée par M$ ou par de nombreux professionels, je continue à penser que WNetRestoreConnectionW correspond à mon besoin.
    Et sur ma question, qui est de savoir si elle est bien intégrée et pourquoi elle plante, quelqu'un a une réponse?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par "cedricgirard
    [quote
    Il serait peut être intéressant pour vous de regarder du côté de la fonction WNetUseConnection().
    Elle sert à créer une connexion, si je lis bien. Or les connexions existent, elles sont juste pas réveillées. Et comme mon programme n'est pas le seul à les utiliser, il serait incohérent qu'il les détruise et les recréé (question de cohérence et de responsabilité des programmes).
    [/quote]

    Bonjour,
    Il me semble avoir vu sur msdn que cette focntion API ne créait une connexion que si elle n'existe pas, sinon elle renvoi l'"erreur" ERROR_ALREADY_ASSIGNED qui est également renvoyée dans le cas de WNetRestoreConnectionW()

    Je pensai que cela pouvait résoudre votre problème.

    Bon courage.


    devYan.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    Citation Envoyé par devyan
    Bonjour,
    Il me semble avoir vu sur msdn que cette focntion API ne créait une connexion que si elle n'existe pas, sinon elle renvoi l'"erreur" ERROR_ALREADY_ASSIGNED qui est également renvoyée dans le cas de WNetRestoreConnectionW()

    Je pensai que cela pouvait résoudre votre problème.

    Bon courage.
    Oui, si elle l'active, ce que le MSDN ne dit pas, et ce qui constitue ma question. Je vais faire le test. Ceci dit, niveau sémantique du code c'est zéro pointé si c'est ça la bonne solution.
    Le fait que les deux renvoient la même erreur ne signifie pas grand chose de mon point de vue (ou alors j'ai raison d'avoir un avis négatif sur Windows )
    Merci pour l'idée

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    Je relance le sujet, je galère encore dessus.
    Donc j'ai exploré toutes les voies, et toutes celles qui demandent un chemin (\\machine\partage), un mot de passe, un identifiant ne peuvent pas convenir. Exit donc net use en ligne de commande, exit tout ce qui créé une connexion.

    Les connexions sur lesquelles je travaille existent, elles sont mémorisées d'une session à l'autre, le soucis est qu'elles ne sont pas actives parfois au démarrage. Cas typique : mon logiciel se lance, et n'arrive pas à lire un fichier sur un lecteur réseau. Pour qu'il puisse le faire, je dois lancer un navigateur et aller manuellement sur ce lecteur réseau.

    Voilà ce que donne un NET USE dans ce genre de situation
    État Local Distant Réseau

    -------------------------------------------------------------------------------
    Non disponib X: \\138.102.25.100\pulsion Réseau Microsoft Windows
    OK Y: \\138.102.25.100\bracer Réseau Microsoft Windows
    Non disponib Z: \\138.102.25.100\cedric Réseau Microsoft Windows
    La commande s'est terminée correctement.
    Mais impossible de trouver comment passer via un NET USE ou via une fonction de l'API Win32 une connexion de "Non disponib" à OK.

    Pour débloquer la situation, je vais lancer en la cachant une fenêtre de l'explorateur, mais je suis certain qu'il existe une solution propre (puisque l'explorateur Windows arrive à les reconnecter)

    Si quelqu'un a une idée...
    Sinon l'appel à la fonction WNetRestoreConnectionW() qui semble convenir à mon besoin plante toujours. Ai-je planté la déclaration?

  8. #8
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    salut

    en tapant WNetRestoreConnectionW delphi sur google j'ai trouvé une source pascal différente de la tienne http://www.freepascal.org/svn/fpc/tr...wawinnetwk.pas et un site ki semble être en allemand http://www.delphipraxis.net/post513449.html

    bon courage =)
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    Effectivement j'allais poster le même. Sont cools les voisins, ils codent en anglais
    Et je confirme, ça marche.

    Merci! Sujet résolu finalement. Sauf si qq m'explique l'erreur que j'ai faite en déclarant ma fonction externe...

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    Ok, donc effectivement pour la fonction que je vise ton premier lien ne mentionne que deux paramêtres alors que la doc M$ en mentionne trois. Et avec deux, ça marche.

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

Discussions similaires

  1. [WS 2008 R2] Appliquer une GPO sur les lecteurs réseaux des PC
    Par noukimibrice dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 13/12/2013, 18h47
  2. Comment réactualiser les lecteurs réseaux ?
    Par gronaze dans le forum Windows 7
    Réponses: 2
    Dernier message: 26/10/2012, 21h37
  3. Lister les lecteur réseaux depuis un serveur AD (vbs)
    Par 4nthon dans le forum VBScript
    Réponses: 1
    Dernier message: 13/08/2012, 15h27
  4. [BATCH] Reconnatre les lecteurs réseaux
    Par eddy31 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 27/12/2007, 05h08
  5. Comment lister les lecteur réseaux
    Par koolway dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 27/03/2006, 12h13

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