4

非常にうまく機能し、ユーザーのスタートメニューへのパスを提供する次のコードがあります。

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

これは明らかに遅延バインディングを使用します。ここで、これを C# または VB.NET の厳密モードで実行したいとします。どちらも遅延バインディングを使用したこの種の構文をサポートしていません。

これは可能ですか?どのように?

助けてくれてありがとう!

4

4 に答える 4

5

これをCOMの方法で解決したい場合は、どのCOM参照をVBプロジェクトに追加するかを理解する必要があります。

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 コンポーネントの名前が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

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)
于 2009-04-22T09:48:22.453 に答える
3

実際には、リフレクションを使用できます。

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 では動的型を使用してこの混乱を解消することができました。

于 2009-04-22T09:46:56.873 に答える
2
Dim DirPath As String = _
    System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)

詳しくはこちらをご覧ください。

于 2009-04-22T09:40:05.250 に答える
0

私の記憶が正しければ、オブジェクト参照を適切なインターフェイスにキャストするだけで済みます。.NET で COM オブジェクトを使用する場合は、通常、タイプ ライブラリをインポートしてから、インターフェイスをすぐに利用できるようにします。

于 2009-04-22T09:24:41.137 に答える