2013-04-19 7 views
0

forkPortableDeviceLib으로 WPD/MTP 장치의 저장소 서비스에서 작동합니다. 그리고 문제가 발생했습니다. 장치에서 파일 개체의 이름을 바꾸려면 먼저 개체의 WPD_OBJECT_ORIGINAL_FILE_NAME 속성을 변경해야합니다. 하지만이 일을 예외가. WPD_OBJECT_NAME을 변경하면 이름은 변경되지만 파일 이름은 예상 한 것과 동일하며 예외는 없습니다.WPD 장치에서 개체의 이름을 바꾸는 방법

그래서 WPD 장치에서 개체의 이름을 바꾸는 방법이 궁금합니다. 파일 이름 속성을 변경하는 중 예외가 발생하는 이유는 무엇입니까?

이유는, 나는 그것은 오래된 응답의 등

답변

1

, 장치에 파일을 복사 할 때 파일이 이미 존재하는 경우이며, 그것은 확장 dup0, dup1과 중복을 얻는다 이름을 바꿀하지만 ...

__declspec(dllexport) HRESULT __cdecl supportsCommand(CComPtr<IPortableDevice>& device, PROPERTYKEY theKey) { 
    HRESULT err = S_OK; 
    CComPtr<IPortableDeviceCapabilities> capabilities; 
    CComPtr<IPortableDeviceKeyCollection> commands; 
    uint numCommands = 0; 
    device->Capabilities(&capabilities); 
    err = capabilities->GetSupportedCommands(&commands); 
    err = commands->GetCount(&numCommands); 
    PROPERTYKEY key = WPD_PROPERTY_NULL; 
    for(uint index = 0; index < numCommands; index++) { 
     err = commands->GetAt(index, &key); 
     if(IsEqualPropertyKey(theKey, key)) 
      return true; 
    } 
    return false; 
} 

__declspec(dllexport) HRESULT __cdecl renameObject(CComPtr<IPortableDevice>& device, LPWCSTR objectId, LPWCSTR newName) { 
    HRESULT err = S_OK; 
    if (supportsCommand(device, WPD_COMMAND_OBJECT_PROPERTIES_SET) == false) 
     return (HRESULT)-1; 
    CComPtr<IPortableDeviceValues> properties, values, results; 
    err = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**) &properties); 
    err = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**) &values);<br> 
    // Mount the command. 
    err = properties->SetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY 
     , WPD_COMMAND_OBJECT_PROPERTIES_SET.fmtid); 
    err = properties->SetUnsignedIntegerValue(WPD_PROPERTY_COMMON_COMMAND_ID 
     , WPD_COMMAND_OBJECT_PROPERTIES_SET.pid);<br> 
    // Set the values 
    err = properties->SetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, objectId); 
    err = values->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, newName); 
    err = properties->SetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES, values); 
    err = device->SendCommand(0, properties, &results);<br> 
    // Show the results 
    uint count = 0; 
    results->GetCount(&count); 
    PROPERTYKEY key; 
    PROPVARIANT var; 
    for(uint i = 0; i < count; i++) { 
     results->GetAt(i, &key, &var); 
     // ...show key and var... 
    } 
    return err; 
} 
+0

이것은 단지 부분적인 대답이지만, https://github.com/notpod/Notpod2 및 HTTPS와 결합 : // GitHub의
아래 내가 WPD 장치 개체의 이름을 변경하는 데 사용하는 코드입니다 .com/derekwilson/PodcastUtilities 그리고 약간의 파기 후에 나는 해결책을 발견했다. –