简体   繁体   English

如何在WPD设备上重命名对象

[英]How to rename an object on a WPD device

I am making a fork of PortableDeviceLib which works with Storage service on a WPD/MTP device. 我正在制作PortablePortLib的一个分支 ,它与WPD / MTP设备上的存储服务一起使用。 And stumbled upon a problem. 偶然发现一个问题。 I want to rename a file object on a device, so the first thought is to change WPD_OBJECT_ORIGINAL_FILE_NAME property of an object. 我想在设备上重命名文件对象,因此首先想到的是更改对象的WPD_OBJECT_ORIGINAL_FILE_NAME属性。 But i get an exception doing this. 但是我这样做很例外。 If I change WPD_OBJECT_NAME , the name changes, but the filename is the same as expected, and there is no exception. 如果更改WPD_OBJECT_NAME ,名称将更改,但文件名与预期的相同,也不例外。

So the question is, how to rename an object on WPD device? 所以问题是,如何在WPD设备上重命名对象? Why do I get exception changing filename property? 为什么我得到异常更改文件名属性?

The reason, I want to rename is, when copying files to device, if the file already exists, it gets a duplicate with extension dup0 , dup1 , etc. 我想重命名的原因是,在将文件复制到设备时,如果文件已经存在,它将得到扩展名dup0dup1等的副本。

It's an old response, but... 这是一个古老的回应,但是...
Below is the code I use to rename an object on WPD device: 以下是我用来在WPD设备上重命名对象的代码:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM