0

WPD/MTP デバイスのストレージ サービスで動作するPortableDeviceLibのフォークを作成しています。そして、問題に遭遇しました。デバイス上のファイル オブジェクトの名前を変更したいので、最初に考えることは、オブジェクトのプロパティを変更することです。しかし、これを行うと例外が発生します。を変更すると、名前は変更されますが、ファイル名は予想どおりで、例外はありません。WPD_OBJECT_ORIGINAL_FILE_NAMEWPD_OBJECT_NAME

問題は、WPD デバイス上のオブジェクトの名前を変更する方法です。ファイル名のプロパティを変更すると例外が発生するのはなぜですか?

名前を変更したい理由は、ファイルをデバイスにコピーするときに、ファイルが既に存在する場合、拡張子dup0dup1などの重複を取得するためです。

4

1 に答える 1

1

古い応答ですが...
以下は、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;
}
于 2013-06-20T18:21:07.550 に答える