2012-09-10 42 views
4

我一直在嘗試使用WPD Apis在c#中編寫示例應用程序,以將圖像文件傳輸到連接的WPD支持設備。 我一直在關注THIS的鏈接。我的問題是,每次我嘗試傳輸文件時,我都會收到錯誤消息:價值不符合預期範圍。 有沒有人嘗試過同樣的成功。任何指針都非常感謝。使用WPD(Windows便攜式設備)Apis傳輸圖像文件時出錯

下面是我面對錯誤的代碼片段

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(... 錯誤,下面是我如何設定的參數。我覺得有東西錯我設置還是我缺少一些需要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); 

回答

2

我一直在研究這個相同的錯誤很長一段時間了,我想我可能已經找到了它。在我的情況下,問題是在代碼中設置WPD_PARENT_OBJECT_ID

在大多數例子中,我看到每個人都在設定的對象ID是這樣的:

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

但實際上,他們從字面上想要的標識文件夾,它與文件夾路徑完全不同。

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

當我以這種方式設置我的值時,目標流沒有問題寫入設備。

只是一些額外的背景資料,對象ID來自IPortableDeviceContent變量

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

不管怎樣,我希望這有助於!

2

這將是有益的,如果你能提供更多細節,比如哪些線(S)的代碼是給這個錯誤,製造商/您正在嘗試機智的WPD設備的型號h等。

此錯誤相當通用,可能意味着參數格式不正確,或者您在調用CreateObjectWithPropertiesAndData時超出範圍參數。如果是這種情況,那麼它將有助於顯示您傳遞到設備中的參數的值。

+0

Lisa,我已經更新了問題,其代碼出現了問題,並使用了參數列表。 – Anuj

+0

看起來問題在於您在IStream :: write調用中設置的字節數。你可以嘗試傳遞bytesRead而不是optimalTransferSize嗎? –

+0

會試試Lisa並會更新。感謝您的建議。 – Anuj

0

瓦朗斯帕拉西奧的答案是有效的!

您可以從這裏下載示例的源代碼,使用WPDApi將文件傳輸到便攜式設備(https://dl.dropboxusercontent.com/u/40603470/WPDTransferToDevice.zip)。請記住使用文件夾的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(); 
相關問題