错误在使用WPD(Windows便携式设备)API,用于传输图像文件 [英] Errors while using WPD (Windows Portable Device) Apis for transferring image files

查看:1056
本文介绍了错误在使用WPD(Windows便携式设备)API,用于传输图像文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直想写使用WPD API进行图像文件传送到连接WPD在C#示例应用程序支持的设备。
我一直在关注链接。我的问题是,每次我尝试和传输文件我不断收到错误:值没有在预期的范围内。
有没有人尝试成功地这样做。任何指针高度赞赏。



下面是我面对的误差



 <代码段code> IPortableDeviceContent内容; 
this._device.Content(出内容);

IPortableDeviceValues值=
GetRequiredPropertiesForContentType(文件名,parentObjectId);

PortableDeviceApiLib.IStream tempStream;
UINT optimalTransferSizeBytes = 0;
content.CreateObjectWithPropertiesAndData(
值,
OUT tempStream,
裁判optimalTransferSizeBytes,
NULL);

System.Runtime.InteropServices.ComTypes.IStream targetStream =
(System.Runtime.InteropServices.ComTypes.IStream)tempStream;

{使用
(VAR的SourceStream =
新的FileStream(文件名,FileMode.Open,FileAccess.Read))
{
变种缓冲=新字节[optimalTransferSizeBytes]
INT读取动作;

{
读取动作= sourceStream.Read(
缓冲,0,(INT)optimalTransferSizeBytes);
IntPtr的pcbWritten = IntPtr.Zero;
targetStream.Write(
缓冲区(INT)optimalTransferSizeBytes,pcbWritten);
}当(读取动作大于0);
}
targetStream.Commit(0);
}
终于
{
对Marshal.ReleaseComObject(tempStream);
}

出现在该行的错误targetStream.Write(...
和下面是我如何设定的参数。我觉得有蹊跷的是我设置还是我缺少一些必需PARAMS的参数。

  IPortableDeviceValues值= 
新PortableDeviceTypesLib.PortableDeviceValues()作为IPortableDeviceValues;

变种WPD_OBJECT_PARENT_ID =新_tagpropertykey();
WPD_OBJECT_PARENT_ID.fmtid =
新的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 =新的FileInfo(文件名);
变种WPD_OBJECT_SIZE =新_tagpropertykey();
WPD_OBJECT_SIZE.fmtid =
新的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);

变种WPD_OBJECT_ORIGINAL_FILE_NAME =新_tagpropertykey();
WPD_OBJECT_ORIGINAL_FILE_NAME.fmtid =
新的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(文件名));

变种WPD_OBJECT_NAME =新_tagpropertykey();
WPD_OBJECT_NAME.fmtid =
新的GUID(0xEF6B490D,0x5CD8,0x437A,0xAF执行,0xFC有,
0xDA,0x8B,0x60的,0xEE,0x4A,0x3C符号);
WPD_OBJECT_NAME.pid = 4;
values.SetStringValue(WPD_OBJECT_NAME,Path.GetFileName(文件名));

变种WPD_OBJECT_FORMAT =新_tagpropertykey();
WPD_OBJECT_FORMAT.fmtid =新的GUID(0xef2107d5,0xa52a,0x4243,0xa2,0x6b,0X62,0xd4,0x17已,0x6d,0x76,×03);
WPD_OBJECT_FORMAT.pid = 6;
values.SetGuidValue(WPD_OBJECT_FORMAT,WPD_OBJECT_FORMAT.fmtid);


解决方案

我已经工作了相当一本同样的错误而现在,我想我可能已经找到了。对我来说,问题是在代码中设置WPD_PARENT_OBJECT_ID



在大多数例子中,我看到每个人都在设置这样的对象ID:

 字符串parentObjectId =InternalStorage / SomeFolder /父; 

变种WPD_OBJECT_PARENT_ID =新_tagpropertykey();
WPD_OBJECT_PARENT_ID.fmtid =
新的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);



但在现实中,他们硬是要的文件夹,这是从文件夹路径完全不同的id

  //的对象ID取决于什么设备分配给文件夹
串parentObjectId =o6AC; //就像从我的设备

VAR WPD_OBJECT_PARENT_ID一个例子=新_tagpropertykey();
WPD_OBJECT_PARENT_ID.fmtid =
新的GUID(0xEF6B490D,0x5CD8,0x437A,0xAF执行,0xFC有,
0xDA,0x8B,0x60的,0xEE,0x4A,0x3C符号);
WPD_OBJECT_PARENT_ID.pid = 3;

当我以这种方式成立了我的价值观,目标流没有问题写入设备。



只是一些额外的背景资料,对象ID来自IPortableDeviceContent变量

  IPortableDeviceContent内容; 
Device.Content(出内容); //设备应设置elseware

IEnumPortableDeviceObjectIDs的ObjectID;
content.EnumObjects(0,parent.Id,空,出来的ObjectID);

//的ObjectID是所有的对象
UINT牵强的集合; //让我们知道,如果一个物体被抓住与否

//这是一个特定的文件夹的实际对象ID上的设备
//由ObjectIds.Next功能$ B填充$ b串ActualObjectId;

objectIds.Next(1,出ActualObjectId,楼盘取);



反正我希望这可以帮助!


I have been trying to write a sample application in c# using WPD Apis for transferring image files to a connected WPD supported device. I have been following THIS link. My problem is that everytime i try and transfer a file i keep getting the error: Value does not fall within expected range. Has anyone tried doing the same successfully. Any pointers are highly appreciated.

Below is the code snippet where i face the error

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

The error appears in the line targetStream.Write(... And below is how i have set the parameters. I think there is something wrong with the parameters that i am setting or i am missing some required params.

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

解决方案

I have been working on this same error for quite a while now and I think I might have found it. In my case, the problem was in the code setting WPD_PARENT_OBJECT_ID

In most examples, I saw that everyone was setting the object id like this:

string parentObjectId = "InternalStorage/SomeFolder/Parent";

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

But in actuality, they literally want the id of the folder, which is completely different from the folder path.

//The object id depends on what the device assigns to the folder
string parentObjectId = "o6AC"; //Just as an example from my device

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 ;

When I set up my values in this way, the target stream had no problem writing to the device.

Just for some extra background info, the object id comes from the IPortableDeviceContent variable

IPortableDeviceContent content;
Device.Content( out content ); //Device should be set elseware

IEnumPortableDeviceObjectIDs objectIds;
content.EnumObjects( 0, parent.Id, null, out objectIds );

//objectIds is a collection of all the objects
uint fetched; //lets us know if an object was grabbed or not

//This is the actual Object Id of that specific folder on the device
//Populated by the ObjectIds.Next function
string ActualObjectId;

objectIds.Next( 1, out ActualObjectId, ref fetched );

Anyways I hope this helps!

这篇关于错误在使用WPD(Windows便携式设备)API,用于传输图像文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆