none
OpenSavePidlMRU RRS feed

  • Question

  • Bonjour,

    Mon problème est le suivant: L'utilisateur du logiciel charge un fichier sur le net.

    Le chemin du fichier + nom du fichier chargé est inconnu et doit être retrouvé.

    Avec windowXP, pas de problème on a la clé HKCU\microsoft\windows\CurrentVersion...

    \explorer\Comdlg32\OpenSaveMRU\* dans la base de registre  qui permet d'obtenir

    facilement les renseignements cherchés (lisibles et non codés).

    Avec VISTA c'est plus délicat. OpenSaveMRU n'existe pas et est remplacée par

    OpenSavePidlMRU\* qui contient MRUListEx facile a déchiffrer et qui pointe

    sur le nom du fichier (REG_BINARY) où on peut lire les renseignements

    recherchés après transformation ASCII donc rien de secret. Quel est le code qui

    permet de lire ces renseignements ? La seule chose que j'ai trouvée à l'adresse

    http://stackoverflow.com/questions/1996318/c-sharp-registry-system-byte-to-string

    ou il y a un morceau de code (en C ?) concernant  SHGetPathFromIDListW

    mais que je suis incapable de transformer en VBasic. La solution à mon problème est elle là ?

    Si oui qqun peut il me transposer ce code en VB2010 ?

    merci

    jeudi 9 février 2012 16:09

Réponses

Toutes les réponses

  • Bonjour,

    Pouvez-vous nous indiquer le code que vous souhaitez traduire en VB .NET ?

    Vous avez un convertisseur C# <=> VB .NET qui est disponible à cette adresse :

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 9 février 2012 16:38
    Modérateur
  • private string GetPathFromPIDL(byte[] byteCode)
       
    {
           
    //MAX_PATH = 260
           
    StringBuilder builder = new StringBuilder(260);

           
    IntPtr ptr = IntPtr.Zero;
           
    GCHandle h0 = GCHandle.Alloc(byteCode, GCHandleType.Pinned);
           
    try
           
    {
                ptr
    = h0.AddrOfPinnedObject();
           
    }
           
    finally
           
    {
                h0
    .Free();
           
    }

           
    SHGetPathFromIDListW(ptr, builder);

           
    return builder.ToString();
       
    }

    Prototype for SHGetPathFromIDListW():

    [DllImport("shell32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SHGetPathFromIDListW(IntPtr pidl,
     [MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszPath);

    les 2 dernières lignes n'en font qu'une

    jeudi 9 février 2012 16:58
  • Bien que je ne comprenne  pas tout, voila la "traduction" du code C# ci dessous

      Public Declare Function SHGetPathFromIDList Lib "shell32" Alias _
      "SHGetPathFromIDListW" (ByVal Pidl As Integer, _
      <MarshalAs(UnmanagedType.LPStr, SizeConst:=MAX_PATH)> ByRef pszPath As  _
      System.Text.StringBuilder) As Integer

      Imports System.Runtime.InteropServices   'pour gchandle etc...
      Imports System.Security.Permissions

      <SecurityPermission(SecurityAction.Demand, UnmanagedCode:=True)>    'faut il FALSE ?
      Private Function GetPathFromPIDL(ByVal byteCode As Byte()) As String
        'MAX_PATH = 255
        Try
          Dim builder As New System.Text.StringBuilder(MAX_PATH)
          Dim ptr As IntPtr = IntPtr.Zero
          Dim h0 As GCHandle = GCHandle.Alloc(byteCode, GCHandleType.Pinned)
          Try
            ptr = h0.AddrOfPinnedObject()
          Finally
            h0.Free()
          End Try
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     

         SHGetPathFromIDList(ptr, builder)
          entraine l'erreur   "accessviolationexception"

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

           Return builder.ToString()
        Catch ex As Exception
            Stop
        End Try
      End Function

    vendredi 10 février 2012 17:38