4

WindowsAPICodePack を使用して、Win8/64bit でエクスプローラー/シェル処理を行っています。x64 プラットフォーム ターゲットでファイル プロパティを反復処理するときに、プロパティ システムに問題があり、AccessViolationException が発生します。PropVariant.cs に問題があるようです。x86 に切り替えると問題は解決しますが、ディレクトリ リストが不完全になります (system32/drivers に「etc」がありません)。何か案は?

using System;
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

namespace ApiCodepackTest
{
    class Program
    {
        const string path = @"c:\windows\system32\drivers";
        static void Main(string[] args)
        {
            var shellObject = (ShellFolder)ShellObject.FromParsingName(path);
            showProperties(shellObject);
            showItems(shellObject);
            Console.ReadLine();
        }

        static void showProperties(ShellFolder folder)
        {
            var sys = folder.Properties.System;
            foreach (var prop in sys.GetType().GetProperties())
            {
                try
                {
                    var shellProperty = prop.GetValue(sys) as IShellProperty;
                    if (shellProperty != null && shellProperty.ValueAsObject != null)
                        Console.WriteLine(shellProperty.CanonicalName + " " + shellProperty.ValueAsObject);
                }
                catch{} //you should not pass!
            }
        }

        static void showItems(ShellFolder folder)
        {
            foreach (var i in folder)
                Console.WriteLine(i.Name);
        }
    }
4

1 に答える 1

3

私は実際には pinvoke や C++ のものには興味がありませんが、ソースを再コンパイルして PropVariant.cs を少し修正しました。

//[FieldOffset(12)] original
    [FieldOffset(16)]
    IntPtr _ptr2;

これで問題が修正されました

于 2015-02-10T13:02:31.827 に答える