En utilisant la liaison anticipée sur un objet COM
-
13-09-2019 - |
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!
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.
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.