Как записать IntPtr в файл в UWP - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь сообщить об ошибке в декодере MP3, и разработчик попросил меня сгенерировать файл PCM для него, чтобы определить проблему.

Итак, это код, который я использовал для создания файла PCM

private async Task NewMethod()
    {
        var file = await SelectPlaybackFile();
        await Task.Run(() =>
        {
            _handle = Bass.BASS_StreamCreateFile(file.Path, 0,0,BASSFlag.BASS_STREAM_AUTOFREE | BASSFlag.BASS_SAMPLE_FLOAT);
            var _myDSPProc = new DSPPROC(Dsp1);
            int dspHandle = Bass.BASS_ChannelSetDSP(_handle, _myDSPProc, IntPtr.Zero, 0);

            Bass.BASS_ChannelPlay(_handle, false);
        });

    }

    unsafe void Dsp1(int handle, int channel, IntPtr buffer, int length, IntPtr user)
    {
    }

Я заметил, что буфер - это неуправляемая память, и я никогда не имел дело с этим раньше. Поэтому я начал проводить исследования и нашел ответ здесь , и это код из этого ответа

private void callback(IntPtr buffer, int length)
{
    FileStream file = new FileStream(filename, FileMode.Create, FileAccess.Write);
    int written;
    WriteFile(file.Handle, buffer, length, out written, IntPtr.Zero);
    file.Close();
}

 [DllImport("kernel32.dll")]
 private static extern bool WriteFile(IntPtr hFile, IntPtr lpBuffer, int NumberOfBytesToWrite, out int lpNumberOfBytesWritten, IntPtr lpOverlapped);

Однако приведенный выше код может не работать в UWP, поскольку приложение работает в «песочнице» и dev не может получить доступ к пути.

Есть ли другой способ помочь записать IntPtr в файл в UWP?

1 Ответ

0 голосов
/ 27 апреля 2018

В приложении UWP вы можете получить доступ к определенным расположениям файловой системы по умолчанию, см. Документ с разрешениями доступа к файлам .

Вы можете попробовать следующий код.

private async void Method(IntPtr buffer, int length)
{
    StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("MyFile.txt", CreationCollisionOption.ReplaceExisting);
    var stream = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.AllowReadersAndWriters);
    unsafe
    {
        UnmanagedMemoryStream ustream = new UnmanagedMemoryStream((byte*)buffer, length);
        ustream.CopyTo(stream.AsStream());
        ustream.Dispose();
        stream.Dispose();
    }
}

Примечание. В Visual Studio следует выбрать конфигурацию Разрешить небезопасный код (щелкните правой кнопкой мыши свой проект => выберите вкладку "Сборка" => выберите Разрешить небезопасный код).

...