4

接続された WPD サポート デバイスにイメージ ファイルを転送するために、WPD Apis を使用して c# でサンプル アプリケーションを作成しようとしています。私はこのリンクをたどっています。私の問題は、ファイルを転送しようとするたびにエラーが発生し続けることです: 値が期待される範囲内にありません。誰もが同じことを成功させようとしましたか。どんな指針も高く評価されます。

以下は、エラーに直面するコードスニペットです

IPortableDeviceContent content;
        this._device.Content(out content);

        IPortableDeviceValues values = 
            GetRequiredPropertiesForContentType(fileName, parentObjectId);

        PortableDeviceApiLib.IStream tempStream;
        uint optimalTransferSizeBytes = 0;
        content.CreateObjectWithPropertiesAndData(
            values,
            out tempStream,
            ref optimalTransferSizeBytes,
            null);           

        System.Runtime.InteropServices.ComTypes.IStream targetStream = 
            (System.Runtime.InteropServices.ComTypes.IStream) tempStream;
        try
        {
            using (var sourceStream = 
                new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[optimalTransferSizeBytes];
                int bytesRead;
                do
                {
                    bytesRead = sourceStream.Read(
                        buffer, 0, (int)optimalTransferSizeBytes);
                    IntPtr pcbWritten = IntPtr.Zero;
                    targetStream.Write(
                        buffer, (int)optimalTransferSizeBytes, pcbWritten);
                } while (bytesRead > 0);
            }
            targetStream.Commit(0);
        }
        finally
        {
            Marshal.ReleaseComObject(tempStream);
        }

エラーは行に表示されます targetStream.Write(... 以下は、パラメーターを設定した方法です。設定しているパラメーターに何か問題があるか、必要なパラメーターが不足していると思います。

IPortableDeviceValues values = 
            new PortableDeviceTypesLib.PortableDeviceValues() as IPortableDeviceValues;

        var WPD_OBJECT_PARENT_ID = new _tagpropertykey();
        WPD_OBJECT_PARENT_ID.fmtid = 
            new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 
                     0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
        WPD_OBJECT_PARENT_ID.pid = 3 ;
        values.SetStringValue(ref WPD_OBJECT_PARENT_ID, parentObjectId);

        FileInfo fileInfo = new FileInfo(fileName);
        var WPD_OBJECT_SIZE = new _tagpropertykey();
        WPD_OBJECT_SIZE.fmtid = 
            new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 
                     0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
        WPD_OBJECT_SIZE.pid = 11;            
        values.SetUnsignedLargeIntegerValue(WPD_OBJECT_SIZE, (ulong) fileInfo.Length);

        var WPD_OBJECT_ORIGINAL_FILE_NAME = new _tagpropertykey();
        WPD_OBJECT_ORIGINAL_FILE_NAME.fmtid = 
            new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 
                     0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
        WPD_OBJECT_ORIGINAL_FILE_NAME.pid = 12;
        values.SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, Path.GetFileName(fileName));

        var WPD_OBJECT_NAME = new _tagpropertykey();
        WPD_OBJECT_NAME.fmtid = 
            new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 
                     0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
        WPD_OBJECT_NAME.pid = 4;
        values.SetStringValue(WPD_OBJECT_NAME, Path.GetFileName(fileName));

        var WPD_OBJECT_FORMAT = new _tagpropertykey();
        WPD_OBJECT_FORMAT.fmtid = new Guid(0xef2107d5, 0xa52a, 0x4243, 0xa2, 0x6b, 0x62, 0xd4, 0x17, 0x6d, 0x76, 0x03);
        WPD_OBJECT_FORMAT.pid = 6;
        values.SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT.fmtid);
4

4 に答える 4

2

このエラーが発生しているコード行、使用しようとしていた WPD デバイスの製造元/モデルなど、詳細をお知らせいただけると助かります。

このエラーはかなり一般的であり、パラメーターが正しくフォーマットされていないか、CreateObjectWithPropertiesAndData を呼び出すときに範囲外のパラメーターを指定していることを意味する可能性があります。この場合、デバイスに渡すパラメーターの値を表示すると役立ちます。

于 2012-09-10T18:35:38.800 に答える
0

ヴァンス・パラシオの答えはうまくいきます!

ここ ( https://dl.dropboxusercontent.com/u/40603470/WPDTransferToDevice.zip ) から (WPDApi を使用してポータブル デバイスにファイルを転送するための) サンプルのソース コードをダウンロードできます。完全なパスではなく、フォルダーの ID (例: o6AC) を使用することを忘れないでください。

var devices = new PortableDeviceCollection();
devices.Refresh();
var kindle = devices.First();
kindle.Connect();

kindle.TransferContentToDevice(@"d:\temp\Kindle_Users_Guide.azw", "06AC");

kindle.Disconnect();
于 2015-12-01T01:06:26.430 に答える