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 :

[D7] Développer un utilitaire réseau [FAQ]


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut [D7] Développer un utilitaire réseau
    Bonjour à tous,

    Je suis connecté à un réseau local qui regroupe environ 300 pc, et je voudrais faire un outil qui permette de voir l'ensemble des PC connecté ainsi que leurs fichiers partagés.

    Je voudrais en fait avoir la meme fonction que quand on fait favoris réseau/voir les ordinateurs du groupe (sous windows...).
    A l'exception prêt que je voudrais arriver à un résultat plus stable (cette fonction plante 1/2 alors que le réseau marche parfaitement) et surtout plus rapide....

    Le problème c'est que je ne sais pas par où commencer mes recherches...

    J'en appelle donc à vous pour m'aiguiller un peu ...

    merci d'avance

    Vince

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    A mon avis utilise WMI qui est dédié à ce type de problèmatique.
    A moins que tu ai envie de coder les APIs...

  3. #3
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Et je rajouterai également ceci
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    Bonjour et merci pour vos réponses...

    J'ai potassé le tutoriel que vous m'avez conseillé. C'est un peu âpre à la première bouchée mais on s'y fait et à force de se prendre la tete on finit par comprendre... du moins l'essentiel dans un premier temps.

    J'ai toutefois quelques petites questions qui me trottent dans la tete :

    Si j'ai bien compris le but est de se connecter à un espace de nom d'un ordinateur présent sur le réseau et après trouver la classe qui va bien pour mon problème (par exemple une classe qui me donne le nom du PC).

    J'ai fait quelque test et j'arrive à me connecter à mes espaces de nom (merci pour tes exemples dans le tutoriel) en mettant //./ dans le chemin ou en mettant mon adresse IP, mais quand j'essaie de me connecter sur un autre PC j'ai un message d'erreur qui m'avertit que je ne suis pas autorisé à faire cette opértion...
    J'ai essayé en changant le paramètre 'strUser' de la méthode ConnectServer mais je ne sais pas vraiment ce que je pourrais mettre....

    Ma question est donc comment arriver à se connecter sur un autre PC ?
    (sans avoir les droits d'administrateur réseau car cette outil est destiné à toutes les personnes lambda du réseau).


    Mon second petit problème, est que pour arriver à se connecter à un autre pc, j'ai forcément besoin de connaitre les adresses IP des PC connectés.
    Pour celà j'ai fait des tests avec le code de cpdump que j'ai trouvé ici http://www.developpez.net/forums/vie...=ping&start=60 (j'espère que ca ne te dérange pas cpdump... si il y a un problème n'hésite pas à me le dire).
    Le problème c'est que j'ai une plage d'adresse IP possible de 512... et que je met plus de 2 min à en scanner 256... C'est trop lent pour l'application que je veux en faire. Est ce qu'il y a un moyen de pringer plus rapidement (autre que de jouer sur le temps de réponse limite que j'ai déja fortement diminué)? Est ce qu'il faut envisager une autre méthode pour connaitre les PC connectés (s'il en existe une autre)?

    Voila merci d'avance pour vos réponses

    Vince

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut Re: [D7] Développer un utilitaire réseau
    Citation Envoyé par plante20100
    Je suis connecté à un réseau local qui regroupe environ 300 pc, et je voudrais faire un outil qui permette de voir l'ensemble des PC connecté ainsi que leurs fichiers partagés.
    Il faut utiliser les fonctions WNet* pour se connecter au network master browser qui garde la liste des bécanes dispo sur le réseau. Pour info, il se passe quelques minutes entre le moment où une bécane est allumée et le moment où elle apparait dans la liste (mais c'est peut-être plus rapide si on se connecte directement sur le browser).

    Plus d'infos en Delphi:

    http://bdn.borland.com/article/0,1410,26876,00.html

    Fred.

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par plante20100
    Ma question est donc comment arriver à se connecter sur un autre PC ?
    (sans avoir les droits d'administrateur réseau car cette outil est destiné à toutes les personnes lambda du réseau).
    Il faut vérifier les droits accordés.
    Il y a un exemple WMI pour la connexion sur un PC distant avec les droits suffisant en étant admin du poste.
    S'il ne fonctionne pas, avec ou sans WMI tu auras du mal à trouver une solution.
    C'est peut être faisable avec un accès indirecte via un service par exemple.
    Mais là je ne pas trop le temps de creuser la question. A mon avis ce n'est pas un pb technique mais un pb de gestion du parc/organisation voit avec les administrateurs comment faire.

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Déjà, il te faut la liste des PC, je te jette en vrac une appli composée de deux unitées que j'ai fait moi même en Delphi 7 (je crois que j'ai récupéré une partie du code dans la FAQ ou dans les Sources du site Developpez.com

    Ca c'est la bibliothèque de fonctions :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    unit Unit2;
     
    interface
     
    uses
     Windows, Classes, Sysutils;
     
    const
       NetApi32 = 'netapi32.dll';
       ERROR_SUCCESS = 0;
       ERROR_MORE_DATA = 234;
       SIZE_SI_101 = 24;
     
     
      SV_TYPE_WORKSTATION          = $1;
      SV_TYPE_SERVER               = $2;
      SV_TYPE_SQLSERVER            = $4;
      SV_TYPE_DOMAIN_CTRL          = $8;
      SV_TYPE_DOMAIN_BAKCTRL       = $10;
      SV_TYPE_TIME_SOURCE          = $20;
      SV_TYPE_AFP                  = $40;
      SV_TYPE_NOVELL               = $80;
      SV_TYPE_DOMAIN_MEMBER        = $100;
      SV_TYPE_PRINTQ_SERVER        = $200;
      SV_TYPE_DIALIN_SERVER        = $400;
      SV_TYPE_XENIX_SERVER         = $800;
      SV_TYPE_SERVER_UNIX          = SV_TYPE_XENIX_SERVER;
      SV_TYPE_NT                   = $1000;
      SV_TYPE_WFW                  = $2000;
      SV_TYPE_SERVER_MFPN          = $4000;
      SV_TYPE_SERVER_NT            = $8000;
      SV_TYPE_POTENTIAL_BROWSER    = $10000;
      SV_TYPE_BACKUP_BROWSER       = $20000;
      SV_TYPE_MASTER_BROWSER       = $40000;
      SV_TYPE_DOMAIN_MASTER        = $80000;
      SV_TYPE_SERVER_OSF           = $100000;
      SV_TYPE_SERVER_VMS           = $200000;
      SV_TYPE_WINDOWS              = $400000;//  'Windows95 +
      SV_TYPE_DFS                  = $800000;//  'Root of a DFS tree
      SV_TYPE_CLUSTER_NT           = $1000000;// 'NT Cluster
      SV_TYPE_TERMINALSERVER       = $2000000;// 'Terminal Server
      SV_TYPE_DCE                  = $10000000;//'IBM DSS
      SV_TYPE_ALTERNATE_XPORT      = $20000000;//'return alternate transport
      SV_TYPE_LOCAL_LIST_ONLY      = $40000000;//'return local only
      SV_TYPE_DOMAIN_ENUM          = $80000000;
      SV_TYPE_ALL                  = $FFFFFFFF;
     
      SV_PLATFORM_ID_OS2  = 400;
      SV_PLATFORM_ID_NT   = 500;
     
      PLATFORM_ID_DOS     = 300;
      PLATFORM_ID_OS2     = 400;
      PLATFORM_ID_NT      = 500;
      PLATFORM_ID_OSF     = 600;
      PLATFORM_ID_VMS     = 700;
     
      MAJOR_VERSION_MASK = $F;
     
    type
     
       PSERVER_INFO_101 = ^SERVER_INFO_101;
     
       SERVER_INFO_101 = record
         dwPlatformId : integer;
         lpszServerName: LPWSTR;
         dwVersionMajor: integer;
         dwVersionMinor: integer;
         dwType: integer;
         lpszComment: LPWSTR;
      end;
     
     
    //function NetApiBufferFree(BufPtr : pointer): integer; stdcall;
    procedure GetServers(filter : Dword; const domain : string; list : TStrings);
    Var
    NetAPI: THandle;
     
    _NetServerEnum: function(serverName : PWideChar; level : Integer;
       var BufPtr : Pointer; prefMaxLen : Integer; var entriesRead,
       totalEntries : Integer; servertype : Integer; domain : PWideChar;
       var resume_handle : Integer) : integer; stdcall;
     
    _NetApiBufferFree: function(BufPtr : pointer): integer; stdcall;
     
    implementation
     
    //function NetServerEnum; external netapi32;
    //function NetApiBufferFree; external netapi32;
    Function GetPlatformString(var dwPlatformID:integer):string;
    begin
       Case dwPlatformID of
          PLATFORM_ID_DOS: result:= 'DOS';
          PLATFORM_ID_OS2: result:= 'Windows';
          PLATFORM_ID_NT:  result:= 'Windows NT';
          PLATFORM_ID_OSF: result:= 'OSF';
          PLATFORM_ID_VMS: result:= 'VMS';
       End;
     
    End;
     
     
    procedure GetServers(filter : Dword; const domain : string; list : TStrings);
    var
     wServerName : WideString;
     wDomain : WideString;
     pwDomain : PWideChar;
     rv : Dword;
     p : PSERVER_INFO_101;
     buffer : pointer;
     i, entriesRead,
     totalEntries, MAX_PREFERRED_LENGTH,
     NIL_HANDLE : Integer;
     ServerName : string;
     os:string;
     line:string;
     
    begin
     list.Clear;
     ServerName := '';
     wServerName := ServerName;
     MAX_PREFERRED_LENGTH := -1;
     wDomain := domain;
     if domain = '' then
       pwDomain := Nil
     else
       pwDomain := PWideChar (wDomain);
     NetAPI := SafeLoadLibrary(NetApi32);
     if NetAPI <> 0 then
     begin
       @_NetServerEnum := GetProcAddress(NetAPI, 'NetServerEnum');
       @_NetAPIBufferFree := GetProcAddress(NetAPI, 'NetApiBufferFree');
     end
     else
       Exit;
     rv := _NetServerEnum (PWideChar (wServerName), 101, buffer, MAX_PREFERRED_LENGTH,
                         entriesRead,  totalEntries, filter, pwDomain, NIL_HANDLE);
     if rv = ERROR_SUCCESS then
       try
         p := PSERVER_INFO_101 (buffer);
         for i := 0 to entriesRead - 1 do
         begin
           os:=GetPlatformString(p^.dwPlatformId) +' '+ inttostr(p^.dwVersionMajor)+'.'+ inttostr(p^.dwVersionMinor);
           if os='Windows NT 5.0' then os:='Windows 2000';
           if os='Windows NT 5.1' then os:='Windows XP';
           line:='"'+string(p^.lpszServerName)+'";"'+os+'"';
           list.AddObject (line, TObject ( p^.dwPlatformId));
           Inc(p);
         end
       finally
         _NetAPIBufferFree(buffer);
       end
     else
       raise Exception.CreateRes(rv);
    end;
     
    end.
    et ça, c'est le programme principal :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, JvDirectories, JvComponent,unit2, ComCtrls, Grids,
      ValEdit;
    const
      nbenum=10;
      displaytypeenum:array[0..nbenum-1] of string=
          ('All servers',
          'NT/2000 workstations or servers',
          'Windows 95 or later',
          'Servers running Windows for Workgroups',
          'Servers running Unix',
          'LAN Manager workstations',
          'LAN Manager servers',
          'NT/2000 servers not domain controller',
          'Servers maintained by the browser',
          'Primary Domain (ignore version info)');
      typeenum:array[0..nbenum-1] of cardinal=
          (SV_TYPE_ALL,
           SV_TYPE_NT,
           SV_TYPE_WINDOWS,
           SV_TYPE_WFW,
           SV_TYPE_SERVER_UNIX,
           SV_TYPE_WORKSTATION,
           SV_TYPE_SERVER,
           SV_TYPE_SERVER_NT,
           SV_TYPE_LOCAL_LIST_ONLY,
           SV_TYPE_DOMAIN_ENUM);
    type
      TForm1 = class(TForm)
        Button1: TButton;
        ComboBox1: TComboBox;
        Label1: TLabel;
        Edit1: TEdit;
        Label3: TLabel;
        JvDirectories1: TJvDirectories;
        ValueListEditor1: TValueListEditor;
        Label2: TLabel;
        ValueListEditor2: TValueListEditor;
        procedure FormShow(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses strutils;
     
    {$R *.dfm}
     
    procedure TForm1.FormShow(Sender: TObject);
    var i:integer;
    begin
      for i:=0 to nbenum-1 do ComboBox1.Items.Add(displaytypeenum[i]);
      ComboBox1.ItemIndex:=0;
    end;
     
    function conv(S:string):string;
    var i:integer;
    begin
      result:='';
      for i:=1 to length(S) do
      if S[i]<>'"' then
      begin
        if S[i]=';' then result:=result+'='
                    else result:=result+s[i];
      end;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var chemin:string;
        asl,asl2:TStringList;
        i:integer;
    begin
     
      chemin:=jvdirectories1.Desktop+'liste.csv';
      asl:=TStringList.Create;
      asl2:=TStringList.Create;
      if FileExists(chemin) then asl.LoadFromFile(chemin);
      GetServers(typeenum[ComboBox1.ItemIndex],edit1.Text,asl2);
     
      ValueListEditor1.Strings.Clear;
      ValueListEditor2.Strings.Clear;
      if asl2.count>0 then
      for i:=0 to asl2.Count-1 do
      begin
        if asl.IndexOf(asl2.Strings[i])=-1 then
        begin
          asl.Add(asl2.Strings[i]);
          ValueListEditor2.Strings.Add(conv(asl2.Strings[i]))
        end;
      end;
      asl.Sort;
     
      if ComboBox1.ItemIndex=0 then
      begin
        ValueListEditor1.Strings.Text:=conv(asl.Text);
        asl.SaveToFile(chemin);
      end
      else ValueListEditor1.Strings.text:=conv(asl2.Text);
      label1.Caption:=IntToStr(ValueListEditor1.Strings.Count);
      label2.Caption:=IntToStr(ValueListEditor2.Strings.Count);
      asl.Free;
      asl2.Free;
     
    end;
     
    end.
    Dans La ValuListEditor1 tu récupères tous les Noms des PC ainsi que leur OS qui son actuellement connectés.

    La ValueListEditors2 maintient un historique des PC qui ont déjà été trouvés et utilise comme "base de donnée", un fichier texte nommé liste.csv qui est chargé au démarrage de l'appli ert sauvegardé après chaque mise-à-jour. Ce fichier texte, tel que le programme est écrit ici, doit obligatoirement exister, même vide.

    A partir de là, tu devrait pouvoir trouver les répertoires partagés en te débrouillant avec les API Windows : cherche dans la SDK Windows avec comme mot clés : LAN Manager Structures

    Bon courage
    Bidouilleuse Delphi

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    Great!!!!
    Je m'y met dès ce soir et je te tiens au courant.
    Merci beaucoup pour ton aide et ton code

    vince

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    euh j'ai un petit problème....

    J'arrive pas à installer JVCL sur mon PC.... Quand j'execute Install.bat il me marque delphi \ BCB non installé dans la fenetre de commande....

    C'est koi ce BCB?

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    T'occupes pas de JVCL pour ce que je t'ai donné comme code ! Ce n'est absolument pas nécessaire.

    Voici le correctif pour l'unité 1:
    (j'ai écris "correction ici") pour que tu vois où sont les corrections apportées pour éviter la JVCL

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,  unit2, ComCtrls, Grids, ValEdit; //<--corrections ici
    const
      nbenum=10;
      displaytypeenum:array[0..nbenum-1] of string=
          ('All servers',
          'NT/2000 workstations or servers',
          'Windows 95 or later',
          'Servers running Windows for Workgroups',
          'Servers running Unix',
          'LAN Manager workstations',
          'LAN Manager servers',
          'NT/2000 servers not domain controller',
          'Servers maintained by the browser',
          'Primary Domain (ignore version info)');
      typeenum:array[0..nbenum-1] of cardinal=
          (SV_TYPE_ALL,
           SV_TYPE_NT,
           SV_TYPE_WINDOWS,
           SV_TYPE_WFW,
           SV_TYPE_SERVER_UNIX,
           SV_TYPE_WORKSTATION,
           SV_TYPE_SERVER,
           SV_TYPE_SERVER_NT,
           SV_TYPE_LOCAL_LIST_ONLY,
           SV_TYPE_DOMAIN_ENUM);
    type
      TForm1 = class(TForm)
        Button1: TButton;
        ComboBox1: TComboBox;
        Label1: TLabel;
        Edit1: TEdit;
        Label3: TLabel;
        JvDirectories1: TJvDirectories;
        ValueListEditor1: TValueListEditor;
        Label2: TLabel;
        ValueListEditor2: TValueListEditor;
        procedure FormShow(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses strutils;
     
    {$R *.dfm}
     
    procedure TForm1.FormShow(Sender: TObject);
    var i:integer;
    begin
      for i:=0 to nbenum-1 do ComboBox1.Items.Add(displaytypeenum[i]);
      ComboBox1.ItemIndex:=0;
    end;
     
    function conv(S:string):string;
    var i:integer;
    begin
      result:='';
      for i:=1 to length(S) do
      if S[i]<>'"' then
      begin
        if S[i]=';' then result:=result+'='
                    else result:=result+s[i];
      end;
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    var chemin:string;
        asl,asl2:TStringList;
        i:integer;
    begin
     
      PromptForFileName(chemin);  //<--correction ici
      asl:=TStringList.Create;
      asl2:=TStringList.Create;
      if FileExists(chemin) then asl.LoadFromFile(chemin);
      GetServers(typeenum[ComboBox1.ItemIndex],edit1.Text,asl2);
     
      ValueListEditor1.Strings.Clear;
      ValueListEditor2.Strings.Clear;
      if asl2.count>0 then
      for i:=0 to asl2.Count-1 do
      begin
        if asl.IndexOf(asl2.Strings[i])=-1 then
        begin
          asl.Add(asl2.Strings[i]);
          ValueListEditor2.Strings.Add(conv(asl2.Strings[i]))
        end;
      end;
      asl.Sort;
     
      if ComboBox1.ItemIndex=0 then
      begin
        ValueListEditor1.Strings.Text:=conv(asl.Text);
        asl.SaveToFile(chemin);
      end
      else ValueListEditor1.Strings.text:=conv(asl2.Text);
      label1.Caption:=IntToStr(ValueListEditor1.Strings.Count);
      label2.Caption:=IntToStr(ValueListEditor2.Strings.Count);
      asl.Free;
      asl2.Free;
     
    end;
    Ca fera tout aussi bien l'affaire...
    Bidouilleuse Delphi

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    Tout d'abord merci pour ton code. Je l'ai testé et ca marche nickel à part que... quand la fonction
    voir les ordinateurs du groupe
    de windows plante, le logiciel aussi ( sur la ligne
    rv := _NetServerEnum (PWideChar (wServerName), 101, buffer, MAX_PREFERRED_LENGTH,
    entriesRead, totalEntries, filter, pwDomain, NIL_HANDLE);
    Le but de mon appli est justement de combler ce bug de windows. (Je précise que dans ces cas là le réseau en lui meme continu à fonctionner, on peut accéder aux ressources partages des différentes personnes.)

    Donc voila retour à la case départ

    Vince

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Alors justement, à partir de là, pourquoi n'ajouterais tu pas un bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
    ...
    finally
    ...
    end;
    ...dans ton code ?

    comme ça, ça ne plantera plus.
    Bidouilleuse Delphi

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par waskol
    comme ça, ça ne plantera plus.
    Certes, mais c'est l'appel de l'API qui pose pb si j'ai bien compris.

    As-tu essayé avec le code de la FAQ ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    Salut.

    Désole de répondre si tard....
    alors j'ai essayé le code de la FAQ. Pour celà j'ai installé les composants JCL (j'y suis finalement arrivé en réinstallant Delphi).
    Le problème c'est quand j'essaie de compiler il me dit qu'il ne trouve pas LM.dcu.

    Et en effet j'ai cherché et j'ai pas trouvé de LM.dcu ni de LM.pas.

    J'ai cherché sur le net et j'ai téléchargé LM.pas et je l'ai rattaché à mon projet. Mais maintenant il me dit qu'il ne connait pas
    TNomDomainNT
    Comprend pas..
    Pourquoi je trouve pas LM.pas après avoir installer le pack des composants JEDI?
    Pourquoi il reconnait pas TNomDomainNT?

    Vince

  15. #15
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Je crois qu'il manque qq infos sur le sujet dans la FAQ
    Regarde ici et télécharge les API Lanmanager.zip
    http://www.delphi-jedi.org/APILIBRARY:220413

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 73
    Points
    73
    Par défaut
    Merci pour le lien, mais dans Lanmanager.zip, il n'y avait pas de LM.pas
    Mais j'ai réussi avec le fichier que j'ai trouvé sur le net. D'ailleurs pour ceux que ca interesse je l'ai trouvé la :http://www.koders.com/delphi/fidADD9...F84B004F7.aspx

    Voila j'ai donc réussi à compiler le code qu'il y a dans la FAQ et ...sans surprise il plante lui aussi au moment de l'appel de l'API....

    Donc voila je suis ouvert à toute proposition....

    Merci et ++

    vince

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    C'est bizarre ton truc, parce que chez moi et au boulot, ça ne plante pas. D'ailleurs, à moins d'avoir fourni un pointeur non initialisé à tes fonction API, ça ne devrait pas planter !

    Je serais toi, je rechercherais la source d'erreur dans tes dll Windows dédiées au fonctionnement réseau, en particulier netapi32.dll qui devrait se trouver typiquement dans le répertoire C:\Windows\system32

    Tu as quelle version de ce fichier ? Moi comme je suis sous XP SP1 et que j'ai installé la mise à jour Microsoft KB35372, j'ai la version 5.1.2600.1343 du fichier.

    Peut-être que ta dll n'est pas la même.
    Bref, on attends ton verdict !
    A+
    Bidouilleuse Delphi

Discussions similaires

  1. Choix d'un serveur pour développement d'un réseau social
    Par harris_macken dans le forum Hébergement
    Réponses: 1
    Dernier message: 28/03/2009, 08h25
  2. Développement de jeux & Réseau
    Par GoldenEye dans le forum Réseau et multijoueurs
    Réponses: 18
    Dernier message: 17/07/2008, 22h04
  3. [SQL Server 2005][Client] utilitaire réseau client
    Par gunico dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/03/2006, 09h29
  4. [MFC] Utilitaire réseau
    Par taron dans le forum MFC
    Réponses: 2
    Dernier message: 19/09/2005, 18h25

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