在 COM 对象上使用早期绑定

Lau*_*ent 4 vb.net com option-strict late-binding

我有这段代码运行得很好,并为我提供了用户开始菜单的路径:

    Dim oShell As Object = CreateObject("Shell.Application")
    MsgBox(oShell.NameSpace(11).Self.Path)
Run Code Online (Sandbox Code Playgroud)

这显然使用了后期绑定。现在假设我想在 C# 或 VB.NET 严格模式中执行此操作,这两种模式都不支持这种带有后期绑定的语法。

这可能吗?如何?

谢谢你的帮助!

Dir*_*mar 5

如果你想用 COM 方式解决这个问题,你必须弄清楚在 VB 项目中添加哪个 COM 引用。

打开 regedit 并导航到HKEY_CLASSES_ROOT\<class id>\CLSIDie

HKEY_CLASSES_ROOT\Shell.Application\CLSID
Run Code Online (Sandbox Code Playgroud)

您将找到唯一标识 COM 组件的类 ID。

您现在可以在下面HKEY_CLASSES_ROOT\CLSID查找 COM 组件后面的文件:

HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000}\InProcServer32
Run Code Online (Sandbox Code Playgroud)

显示以下值:

%SystemRoot%\system32\SHELL32.dll
Run Code Online (Sandbox Code Playgroud)

现在转到 Visual Studio,并添加对此文件的引用(在“添加引用”对话框的“浏览”选项卡上)。如果打开项目属性,您实际上会看到添加的 COM 组件的好听名称是Microsoft Shell Controls and Automation

添加引用后,您可以Shell.Application按如下方式使用该对象:

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
Run Code Online (Sandbox Code Playgroud)

C# 版本如下:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您只需要检索“开始”菜单文件夹的位置,您可以直接在 .NET 中使用以下命令执行相同操作

Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
Run Code Online (Sandbox Code Playgroud)