If you want to solve this the COM way you have to figure out, which COM reference to add in your VB project.
Open regedit and navigate to HKEY_CLASSES_ROOT\<class id>\CLSID
, i.e.
HKEY_CLASSES_ROOT\Shell.Application\CLSID
and you will find the class id which uniquely identifies the COM component.
Under HKEY_CLASSES_ROOT\CLSID
you can now look up which file is behind the COM component:
HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000}\InProcServer32
shows the following value:
%SystemRoot%\system32\SHELL32.dll
Now go to Visual Studio, and add a reference to this file (on the Browse tab of the Add References dialog). If you open up the projects properties, you will actually see that the nice name of the COM component added is Microsoft Shell Controls and Automation.
Once the reference is added you can use the Shell.Application
object as follows:
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
A version in C# would look as follows:
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);
}
}
However, if you simply need to retrieve the location of the Start Menu folder you can do the same directly in .NET using
Dim path As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)