Question

J'ai ce morceau de code qui fonctionne très bien et me donne le chemin du menu de démarrage de l'utilisateur:

    Dim oShell As Object = CreateObject("Shell.Application")
    MsgBox(oShell.NameSpace(11).Self.Path)

Il utilise évidemment la liaison tardive. Maintenant, supposons que je veux faire cela en C # ou en mode strict VB.NET, ni qui appuie ce genre de syntaxe avec la liaison tardive.

Est-ce possible? Comment?

Merci pour votre aide!

Était-ce utile?

La solution

Si vous voulez résoudre ce la façon COM que vous devez savoir, qui référence COM à ajouter dans votre projet VB.

Ouvrir regedit et accédez à HKEY_CLASSES_ROOT\<class id>\CLSID, i.e..

HKEY_CLASSES_ROOT\Shell.Application\CLSID

et vous trouverez l'identifiant de classe qui identifie de manière unique le composant COM.

Sous HKEY_CLASSES_ROOT\CLSID vous pouvez regarder maintenant quel fichier se trouve derrière le composant COM:

HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000}\InProcServer32

affiche la valeur suivante:

%SystemRoot%\system32\SHELL32.dll

Maintenant, allez à Visual Studio et ajouter une référence à ce fichier (sur le Parcourir de Ajouter Références boîte de dialogue). Si vous ouvrez les propriétés des projets, vous verrez en fait que le joli nom du composant COM ajouté est Contrôles Microsoft Shell et automatisation .

Une fois que la référence est ajoutée, vous pouvez utiliser l'objet Shell.Application comme suit:

Option Strict On

Module PrintStartMenuLocation

    Sub Main()
        Dim shell As New Shell32.Shell
        Dim folder As Shell32.Folder
        Dim folderItem As Shell32.FolderItem
        Dim startMenuPath As String

        folder = shell.NameSpace(Shell32.ShellSpecialFolderConstants.ssfSTARTMENU)
        folderItem = CType(folder.Items(0), Shell32.FolderItem)
        startMenuPath = folderItem.Path

        Console.WriteLine(startMenuPath)
    End Sub

End Module

Une version en C # regarderait comme suit:

class Program
{
    static void Main(string[] args)
    {
        Shell32.Shell shell = new Shell32.Shell();
        Shell32.Folder folder = shell.NameSpace(Shell32.ShellSpecialFolderConstants.ssfSTARTMENU);
        Shell32.FolderItem folderItem = folder.Items().Item(0) as Shell32.FolderItem;
        string startMenuPath = folderItem.Path;

        Console.WriteLine(startMenuPath);
    }
}

Cependant, si vous avez simplement besoin de récupérer l'emplacement du dossier du menu Démarrer, vous pouvez faire la même chose directement dans .NET en utilisant

Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)

Autres conseils

Eh bien vous pouvez réellement utiliser la réflexion:

Type shellType = Type.GetTypeFromProgID("Shell.Application", true);
object shell = Activator.CreateInstance(shellType);
object folder = shellType.InvokeMember("NameSpace", BindingFlags.InvokeMethod, null, shell, new object[] { 11 });
object self = folder.GetType().InvokeMember("Self", BindingFlags.GetProperty, null, folder, new object[] { });
object path = self.GetType().InvokeMember("Path", BindingFlags.GetProperty, null, self, new object[] { });
Console.WriteLine(path);

Pas le genre de code que je l'aime, mais en C # 4.0, vous pouvez utiliser le de type dynamique pour nettoyer ce gâchis.

Dim DirPath As String = _
    System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)

Voir plus.

Si je me souviens bien, tout ce que vous avez à faire est de jeter la référence d'objet dans l'interface appropriée. Si vous utilisez un objet COM dans .NET, vous importez généralement la bibliothèque de type et ensuite les interfaces facilement disponibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top