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 :

Un problème de pointeur ? un NetApiBufferFree récalcitrant


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut Un problème de pointeur ? un NetApiBufferFree récalcitrant
    bonjour,

    je recherche un éclaircissement sur le comportement suivant :

    Je fait une recherche des répertoires partagés sur un réseau avec cette routine

    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
     
    procedure TForm13.Button4Click(Sender: TObject);
    const MAX_PREFERRED_LENGTH = -1;
      NERR_SUCCESS         = 0;
    var
      ER : DWORD; // enries read
      TE : DWORD; // total entries
      ResHandle : DWORD;
      ShareInfo : PSHARE_INFO_1;
      p         : pChar;
      fResult   : NET_API_STATUS;
      i        : Integer;
      z : DWord;
      hote : WideString;
    begin
      Hote:='\\'+host.Text;
      ResHandle := 0;
      fResult := NetShareEnum(PWideChar(Hote), 1, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle);
      if(fResult <> NERR_SUCCESS)then
       begin
        ShowMessage('raté');
        Exit;
       end;
      p := Pointer(ShareInfo);
      for i := 0 to TE - 1 do
      begin
        z:=PSHARE_INFO_1(p).shi1_type;
        if z=0 then begin
        ListBox1.Items.Add(WideCharToString(PSHARE_INFO_1(p)^.shi1_remark));
        ListBox1.Items.Add(WideCharToString(PSHARE_INFO_1(p)^.shi1_netname)+' '+IntToStr(z));
        end;
        p := p + SizeOf(Share_info_1);
      end;
      NetApiBufferFree(@ShareInfo);
    end;
    et au moment de libérer le buffer shareinfo mon programme plante

    ceci dit , si je modifie le test sur z c'est a dire la codification suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        if PSHARE_INFO_1(p).shi1_type=0 then begin
        ....
       end;
    tout se passe correctement

    une idée du pourquoi ? certainement une question de pointeur que des pros vont trouver évidente , mais là je sèche .

    Question subsidiaire mais qui fera peut être l'objet d'un autre post
    comment obtenir les informations de permissions sur un pc distant ?
    car la lecture via netshareenum d'une structure SHARE_INFO_2 échoue
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Serge,

    Une piste pour ton plantage

    http://www.developpez.net/forums/d12...toire-partage/

    Regarde les deux derniers postes

    Tiens j'ai trouvé cela aussi :

    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
      SHARE_INFO_2   = record
        shi2_netname     :  PWideChar;
        shi2_type        :  DWORD;
        shi2_remark      :  PWideChar;
        shi2_permissions :  DWORD;
        shi2_max_uses    :  DWORD;
        shi2_current_uses:  DWORD;
        shi2_path        :  PWideChar;
        shi2_passwd      :  PWideChar;
      end;
     
      PSHARE_INFO_2  = ^SHARE_INFO_2;
     
      function NetShareEnum(ServerName   : PWideChar;
                            Level        : DWORD;
                            bufptr       : Pointer;
                            PrefMaxLen   : DWORD;
                            EntriesRead  : PDWORD;
                            TotalEntries : PDWORD;
                            Resume_Handle: PDWORD):NET_API_STATUS;
                            stdcall; external 'NetAPI32.dll' name 'NetShareEnum';
      function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS;
                            stdcall; external 'NetAPI32.dll' name 'NetApiBufferFree';
     
    ...
     
    implementation
     
    ...
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
      MAX_PREFERRED_LENGTH = -1;
      NERR_SUCCESS         = 0;
    var
      ER : DWORD; // enries read
      TE : DWORD; // total entries
      ResHandle : DWORD;
      ShareInfo : PSHARE_INFO_2;
      p         : pChar;
      fResult   : NET_API_STATUS;
      i         : Integer;
      share, path : string;
    begin
      ResHandle := 0;
      fResult := NetShareEnum(nil, 2, @ShareInfo, DWORD(MAX_PREFERRED_LENGTH), @ER, @TE, @ResHandle);
      if(fResult <> NERR_SUCCESS)then
       Exit;
      p := Pointer(ShareInfo);
      for i := 0 to TE - 1 do
      begin
        share := WideCharToString(PSHARE_INFO_2(p)^.shi2_netname);
        path  := WideCharToString(PSHARE_INFO_2(p)^.shi2_path);
        if path<>'' then path:=', '+path;
        ListBox1.Items.Add(share+path);
        p := p + SizeOf(SHARE_INFO_2);
      end;
      NetApiBufferFree(@ShareInfo);
    end;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Salut mon petit Buzz et merci de répondre .

    Je te rassure je peux éviter le plantage , tout simplement ne ne testant pas sur la variable Z , comme indiqué sur la partie code n°2 .

    Ce que je cherche , c'est a comprendre pourquoi cela plante dans ma première partie . C'est certainement dû à toutes ces manipulations de pointeurs mais la notion de pointeur est loin , très loin dans ma mémoire et je compte sur les lumières des "forumeurs" pour m'expliquer la faute commise .

    Quant à la question subsidiaire , et le code joint , (tu remarqueras que c'est pratiquement le même ) le fait d'utiliser le level 2 pour accèder a une structure SHARE_INFO_2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NetShareEnum(nil, 2, // <- ici le level
    fourni une erreur ACCES_DENIED , tout a fait normale (c'est une question de sécurité) plus de précision sur msdn .

    Comment la contourner sans avoir à fournir user et mdp là est la question ? En fait c'est l'objectif final , trouver un répertoire partagé avec des droits de lecture écriture pour un transit de fichier .
    Pourquoi ? Pas pour un virus ou malware mais pour contourner un problème bête , j'utilise les composants UIB pour faire un backup d'un base Firebird or si on exécute ce backup à partir d'un poste client , surprise , le backup à priori ne se fait que sur le serveur , d'où mon idée de faire transiter sur un répertoire partagé .
    Y a peut être plus simple mais je n'ai trouvé aucune autre solution.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    NetApiBufferFree(ShareInfo) sans le @ ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut où il ne faut pas toujours se mettre en cause
    Citation Envoyé par Paul TOTH Voir le message
    NetApiBufferFree(ShareInfo) sans le @ ?
    bien essayé , mais non !
    et de fait c'est la variable z qui me pose problème , l'utiliser dans ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListBox1.Items.Add(WideCharToString(PSHARE_INFO_1(p)^.shi1_netname)+' '+IntToStr(z));
    ne pose aucun problème

    ce n'est que si je l'utilise (z) pour un test que NetApiBufferFree(@ShareInfo) plante . Etrange . Ceci avec BDS2006 je n'ai pas tester avec D7 par exemple
    peut-être un de cette version ? plutôt que de ma part mais j'ai l'habitude de taper sur le programmeur plutôt que sur l'outil

    [EDIT]
    La réponse était dans l'outil , j'ai transposé le programme sous D7 et là , pas d'erreur . Je savais que D2006 avait quelques Bugs , je ne sais pas si celui-ci est répertorié et , peu importe puisqu'il ne sera pas mis à jour !
    Ca fait du bien de savoir que ce n'est pas dans ma tête le problème !
    Reste la question subsidiaire , mais c'est un autre sujet
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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