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 :

Propriétés de la corbeille


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut Propriétés de la corbeille
    Bonjour,

    Je cherche à lire les paramètres de la corbeille, c'est à dire les espaces réservés par partition ou média complet.
    J'ai bien trouvé et exploité les deux API SHQueryRecycleBin et SHEmptyRecycleBin, mais pas moyen de trouver dans
    les ressources ce qui me permettrais de trouver le moyen de lire ces propriétés.

    Si vous avez une idée, je suis preneur,

    merci

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 102
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 102
    Par défaut
    Bonjour,

    -- je n'ai rien testé, me suis contenté de lire (et pour cause ! Je suis sous Linux, ) --

    une première lecture intéressante, mais peut-être un peu vieillotte :
    https://gist.github.com/maul-esel/1808118

    une deuxième, en purebasic donc ça doit pouvoir s'adapter facilement
    https://www.purebasic.fr/french/viewtopic.php?p=210871

    et peut-être que ça pourrait être la solution à ce problème vieux de 12 ans posté dans un sous-forum de dvlp :
    https://www.developpez.net/forums/d8...in-seven-64-a/

    Bon code et bon dimanche,

  3. #3
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Bonjour Jipété,

    Merci pour ta recherche, mais malheureusement ce que tu as trouvé ne concerne que les deux API que j'ai trouvé sur la corbeille,
    l'interrogation du nombre de fichier et le volume de ces fichiers via SHQueryRecycleBin et
    le vidage de la corbeille via ShEmptyRecyclebin.

    Moi, ce que je cherche, ce sont les propriétés de la corbeille:
    - La liste des disques pourvu d'une corbeille et la place allouée, pour chaque disque, à chaque corbeille.

    Mon objectif étant de savoir, si la place allouée est suffisante pour recevoir un fichier de volume conséquent.
    Car si ce n'est pas le cas, lors de l'envoi de fichier vers la corbeille, si on affiche le dialog de suppression de fichier,
    le système propose de supprimer le fichier définitivement sans possibilité de UNDO, soit d'annuler l'opération.
    Et ces deux solutions ne me conviennent pas.
    Je veux savoir avant le lancement en corbeille, si l'espace alloué est suffisant pour contenir les fichiers envoyés dans cette corbeille.

    Merci

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 581
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    je serai parti sur des WMI mais même avec Wmi Delphi Code Creator je ne vois pas vraiment ce que je cherche
    ou alors par les registres pour obtenir le nom

    Sinon avec IOUtils et le nom il est relativement facile d'obtenir la taille
    code FMX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if TDirectory.Exists('C:\$RECYCLE.BIN') then
        label1.Text:= TFile.GetSize('C:\$RECYCLE.BIN').ToString
        else label1.Text:='non accessible';
    j'ai essayé ça pour obtenir le path
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function GetMyPoubelle : string;
     var
      r: Bool;
      path: array[0..Max_Path] of Char;
     begin
      r := ShGetSpecialFolderPath(0, path, CSIDL_BITBUCKET, False) ;
      if not r then
        raise Exception.Create('Could not find recyclebin folder location.') ;
      Result := Path;
     end;
    mais sans résultat : exception levée

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    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 053
    Par défaut
    Mon D10 n'a pas encore GetSize et la méthode par FindFirst renvoie 0 pour ces dossiers

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volumeon trouve la taille maximale mais j'ignore comment associé le GUID à au disque

    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
    procedure TForm.ButtonClick(Sender: TObject);
     
      function GetFileSize(const APath: string): Int64;
      var
        Sr : TSearchRec;
      Begin
        if FindFirst(APath, faAnyFile, Sr) =  0 then
        begin
          try
            LARGE_INTEGER(Result).HighPart := Sr.FindData.nFileSizeHigh; // 0 !
            LARGE_INTEGER(Result).LowPart := Sr.FindData.nFileSizeLow; // 0 !
          finally
            FindClose(Sr);
          end
        end
        else
          Result := 0;
      end;
     
    var
      C: Char;
      Info: SHQUERYRBINFO;
    begin
      for C := 'A' to 'Z' do
      begin
        ZeroMemory(@Info, SizeOf(Info));
        Info.cbSize := SizeOf(Info);
        if SHQueryRecycleBin(PWideChar(C + ':\'), @Info) = s_OK then
          Memo.Lines.Add(Format('%s:\ - Taille occupée : %do pour %d éléments sur taille maximale %d', [C, Info.i64Size, Info.i64NumItems, GetFileSize(Format('%s:\$RECYCLE.BIN', [C]))]));
      end;
    end;
    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

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    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 053
    Par défaut
    GUID trouvé !

    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
    procedure TForm.ButtonClick(Sender: TObject);
     
      function GetBucketSize(C: Char): Int64;
      var
        VolumeName: array[0..MAX_PATH] of Char;
      Begin
        Result := 0;
        // Bug de déclaration  GetVolumeNameForVolumeMountPointW en LPCSTR au lieu de LPCWSTR
        if GetVolumeNameForVolumeMountPoint(PAnsiChar(PByte(C + ':\')), @VolumeName[0], MAX_PATH) then
        begin
          with TRegistry.Create(KEY_READ) do
          try
            if OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume', False) then
            begin
              if OpenKey(StringReplace(StringReplace(VolumeName, '\\?\Volume', '', []), '\', '', []), False) then
              begin
                Result := ReadInteger('MaxCapacity');
                Result := Result * 1024 * 1024;
              end
              else
                Result := -2;
            end
            else
              Result := -1;
          finally
            Free();
          end;
        end
        else
          RaiseLastOSError();
      end;
     
    var
      C: Char;
      Info: SHQUERYRBINFO;
    begin
      for C := 'A' to 'Z' do
      begin
        ZeroMemory(@Info, SizeOf(Info));
        Info.cbSize := SizeOf(Info);
        if SHQueryRecycleBin(PWideChar(C + ':\'), @Info) = s_OK then
          Memo.Lines.Add(Format('%s:\ - Taille occupée : %do pour %d éléments sur taille maximale %do', [C, Info.i64Size, Info.i64NumItems, GetBucketSize(C)]));
      end;
    end;
    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

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    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 053
    Par défaut
    je confirme que ça donne les chiffres sur le clic droit de la corbeille sur deux PC différents

    C:\ - Taille occupée : 9086280o pour 19 éléments sur taille maximale 14898167808o
    D:\ - Taille occupée : 3039928036o pour 872 éléments sur taille maximale 52157218816o
    C:\ - Taille occupée : 4093830o pour 2 éléments sur taille maximale 7731150848o
    D:\ - Taille occupée : 0o pour 0 éléments sur taille maximale 27151826944o
    E:\ - Taille occupée : 238695o pour 2 éléments sur taille maximale 27151826944o


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Result := ReadInteger('MaxCapacity');
    Result := Result * 1024 * 1024;
    ne donne pas la même chose que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := ReadInteger('MaxCapacity') * 1024 * 1024;
    Même pas un warning sur la possibilité que Integer * 1024 * 1024 est calculé en Integer et pas en Int64 le type de Result
    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

  8. #8
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Merci à tous pour vos recherches et propositions.

    Shai,

    Ta solution est complète et tes tests sont concluants, mais tu as surement une version plus récente que la mienne.
    Dans les déclarations d'API je n'ai pas GetVolumeNameForVolumeMountPoint ni la W d'ailleurs, donc j'ai regardé sur msdn
    et j'ai trouvé cette API. Et là je nage un peu, mais je coule beaucoup...

    Comme tu l'indiques, il y aurait un bug dans le passage des params, mais quand je vois la déclaration MSDN c'est bien un LPCWSTR pour le premier param:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BOOL GetVolumeNameForVolumeMountPointW(
      [in]  LPCWSTR lpszVolumeMountPoint,
      [out] LPWSTR  lpszVolumeName,
      [in]  DWORD   cchBufferLength
    );


    Donc tu pourrais m'en dire plus, car j'ai tenté différentes possibilité, mais j'ai une violation à chaque fois sur l'appel.
    As tu modifié la déclaration dans les sources, pour faire un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function GetVolumeNameForVolumeMountPointW(lpszVolumeMountPoint: LPCSTR; lpszVolumeName: LPWSTR; cchBufferLength: DWORD): boolean; external Kernel32 name 'GetVolumeNameForVolumeMountPointW';
    Ou autrement ?
    Peut être me passer leur déclaration ?

    En tout cas merci encore

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    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 053
    Par défaut
    Je n'ai pas modifié la déclaration, j'ai triché avec le PByte uniquement
    c'est D10 Seatle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function GetVolumeNameForVolumeMountPointW(lpszVolumeMountPoint: LPCSTR; lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'GetVolumeNameForVolumeMountPointW';
    Compatible avec cet appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if GetVolumeNameForVolumeMountPoint(PAnsiChar(PByte(C + ':\')), @VolumeName[0], MAX_PATH) then
    stdcall est nécessaire si compilation en 32Bits
    En 64bits, tout est en fastcall64 normalement et cela n'a pas d'impact de mettre la convention, du moins en théorie.
    BOOL aussi c'est LongBool à 4 octets contrairement à Boolean sur une seul octet, cela ne doit pas aimer non plus

    Effectivement je tenterais la bonne déclaration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function _GetVolumeNameForVolumeMountPoint (lpszVolumeMountPoint: LPCWSTR; lpszVolumeName: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'GetVolumeNameForVolumeMountPointW';
    avec cet appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if _GetVolumeNameForVolumeMountPoint(PChar(C + ':\'), @VolumeName[0], MAX_PATH) then
    De toute façon, cela ne compile pas si l'on mélange les types, donc un nom de fonction différent pour anticiper un jour le passage sur un Delphi plus récent et un conflit de déclarations
    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

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    quand je déclare moi même une API j'ai tendance à tricher encode d'avantage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function GetVolumeNameForVolumeMountPoint (const lpszVolumeMountPoint: string; lpszVolumeName: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'GetVolumeNameForVolumeMountPointW';
    une string constante est totalement compatible avec un PChar comme paramètre en entrée, la DLL va la traiter de toute façon comme un PChar sans y toucher.
    pour le second paramètre c'est possible aussi mais c'est plus "risqué" vu que la DLL va remplir la variable sans tenir compte du compteur COW (Copy on Write) donc c'est plus prudent de rester sur du PChar
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    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 053
    Par défaut
    La String const, je l'ai déjà fait mais j'avoue ne pas trop osé quand même car c'était surtout à l'époque de Brldmm.dll entre mes DLL et que je faisais un peu ça au petit bonheur la chance
    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

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    La String const, je l'ai déjà fait mais j'avoue ne pas trop osé quand même car c'était surtout à l'époque de Brldmm.dll entre mes DLL et que je faisais un peu ça au petit bonheur la chance
    ah oui mais là c'est juste une simplification d'écriture...côté exe on utilise généralement des strings et pour les passer à une API on les converti en PChar...mais comme il n'y a pas de différence technique entre une "const string" et un PChar - vu que les chaînes possèdent toujours un #0 terminal - le fait de déclarer un const string évite simplement le transtypage...mais côté DLL c'est bel est bien un PChar, il n'est pas question de le traiter comme un string avec son compter de référence car cela obligerait en effet à embarquer ShareMem pour partager le gestionnaire de mémoire et rendrait l'API dépendante de Delphi...et d'ailleurs là c'est une API Windows qui attend un PChar qui ne sera jamais considérer comme un string Delphi.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Bonjour,

    Merci, en fait je faisais une erreur ailleurs dans mon code qui me provoquait cette violation, le sdtcall était mal placé
    Je pouvais chercher dans tous les sens comment passer mes pointers,

    Là ça marche nickel merci pour cette solution

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

Discussions similaires

  1. [ActiveX] Propriété "Picture" dans un contrôle util
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/12/2002, 15h59
  2. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56
  3. [ActiveX] Visibilité d'une propriété
    Par paradise dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/11/2002, 18h33
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. [propriétés]Option Checked
    Par psl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/08/2002, 08h07

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