首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重命名WPD设备上的对象

如何重命名WPD设备上的对象
EN

Stack Overflow用户
提问于 2013-04-19 18:37:04
回答 1查看 1.1K关注 0票数 0

我正在制作一个PortableDeviceLibfork,它与存储服务上的WPD/MTP设备。偶然发现了一个问题。我想要重命名设备上的文件对象,因此第一个想法是更改对象的WPD_OBJECT_ORIGINAL_FILE_NAME属性。但我在做这件事时遇到了一个异常。如果我更改了WPD_OBJECT_NAME,名称也会更改,但文件名与预期的名称相同,没有例外。

所以问题是,如何在WPD设备上重命名对象?为什么更改文件名属性时出现异常?

我想重命名的原因是,当将文件复制到设备时,如果文件已经存在,它会得到一个扩展名为dup0dup1等的副本。

EN

回答 1

Stack Overflow用户

发布于 2013-06-21 02:21:08

这是个老生常谈的回答,但是...

下面是我用来在WPD设备上重命名对象的代码:

代码语言:javascript
复制
__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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16102700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档