質問

私はこの作品のコードとして、このパスにユーザーのスタートメニュー:

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

この明らかに使用下旬に結合する。と言えばこういう仕事がしたいクライアントまで、フルのC#またはVB.NET strictモードにもならないこのような書式と下旬に結合する。

可能ですか?いかがですか?

たき助かります!

役に立ちましたか?

解決

あなたのVBプロジェクトに追加するためのCOM参照あなたが把握する必要があり、このCOMの道を、解決したい場合。

regeditを開いてHKEY_CLASSES_ROOT\<class id>\CLSIDに移動、すなわちます。

HKEY_CLASSES_ROOT\Shell.Application\CLSID

あなたが一意にCOMコンポーネントを特定するクラスIDを検索します。

HKEY_CLASSES_ROOT\CLSIDの下であなたが今まで見ることができるCOMコンポーネントの背後にあるどのファイルます:

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

は、以下の値を示しています。

%SystemRoot%\system32\SHELL32.dll

今のVisual Studioに移動し、(の参照の追加]ダイアログボックスののブラウズのタブ上の)このファイルへの参照を追加します。あなたは、プロジェクトのプロパティを開く場合は、実際に追加COMコンポーネントの素敵な名前があるとのマイクロソフトシェルコントロールとオートメーションのを見ることができます。

参照が追加されると、次のように

あなたは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
次のように

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);
    }
}

あなたは、単にスタートメニューフォルダの場所を取得する必要がある場合は、あなたが使用して.NETで直接同じことを行うことができます。

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

他のヒント

でも実際に使えた反射:

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);

な種類のコードが好き、クライアントまで、フルのC#4.0を使用できるの ダイナミック型 クリーンにこの散らかっていたとします。

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

を参照してください。ここを多くのため。

私の記憶が正しければ、

、あなたがしなければならないすべては、適切なインターフェースへのオブジェクト参照をキャストすることです。あなたは.NETでCOMオブジェクトを使用する場合は、通常、タイプライブラリをインポートして、インタフェースが容易に入手しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top