2012-08-07 19 views
12

Windows::Storage::Streams::IBuffer arabirimini uygulayan bir nesneyim var ve bunun dışında bir bayt dizisi almak istiyorum, ancak bu belgeye bakarken Arayüz oldukça işe yaramaz görünüyor ve dokümantasyon amacına ulaşmak için bu arayüzle birleştirilebilecek herhangi bir başka sınıf için herhangi bir referans sunmuyor. Google ile şimdiye kadar bulduğum tek şey .Net sınıfı WindowsRuntimeBufferExtensions'a bir başvurudır ama C++ kullanıyorum, bu da aynı zamanda bir çıkmaz sokak.Windows dışı bir bayt dizisi :: Storage :: Streams :: IBuffer

Birisi, C++ içindeki Windows::Storage::Streams::IBuffer numaralı bayt dizisini nasıl alacağına dair bir ipucu verebilir mi?

cevap

10

Sen IBufferByteAccess kullanabilirsiniz:

Muhtemel bir çözüm Windows::Storage::Streams::DataReader kullanmak olacaktır

byte* GetPointerToPixelData(IBuffer^ buffer) 
{ 
    // Cast to Object^, then to its underlying IInspectable interface. 

    Object^ obj = buffer; 
    ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(obj)); 

    // Query the IBufferByteAccess interface. 
    ComPtr<IBufferByteAccess> bufferByteAccess; 
    ThrowIfFailed(insp.As(&bufferByteAccess)); 

    // Retrieve the buffer data. 

    byte* pixels = nullptr; 
    ThrowIfFailed(bufferByteAccess->Buffer(&pixels)); 

    return pixels; 

} 

kod örneği http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.html

+0

Uygulamamı değiştirdim ve bu yaklaşımı şu an geliştirdiğim için kullanıyorum Uygulamamın performansı. Teşekkürler. –

0

Use the extension method like a static method:

IBuffer *buffer; 
array<unsigned char>^ result= System::Runtime::InteropServices::WindowsRuntime::WindowsRuntimeBufferExtensions::ToArray(buffer); 
+0

user787913 @, ben ilk yanı karıştırılmamalıdır. – MSN

+5

@MSN WindowsRuntimeBufferExtensions bir sınıftır. Net framework, yerel bir C++ uygulamasından kullanılamaz – yms

5

önce de belirtildiği gibi, WindowsRuntimeBufferExtensions ad System::Runtime::InteropServices::WindowsRuntime yerli C++ uygulamalar için, sadece Net uygulamaları için uygun değildir. egzotik COM atmalarını aracılığıyla,

void process(Windows::Storage::Streams::IBuffer^ uselessBuffer) 
{ 
    Windows::Storage::Streams::DataReader^ uselessReader = 
      Windows::Storage::Streams::DataReader::FromBuffer(uselessBuffer); 
    Platform::Array<Byte>^ managedBytes = 
         ref new Platform::Array<Byte>(uselessBuffer->Length); 
    uselessReader->ReadBytes(managedBytes);        
    BYTE * bytes = new BYTE[uselessBuffer->Length]; 
    for(int i = 0; i < uselessBuffer->Length; i++) 
     bytes[i] = managedBytes[i]; 

    (...) 
} 
+1

'uselessBuffer' - lol, bu benim günümü ... – Zak

7

Bu bir C kopyalanan ++/CX sürümü:

std::vector<unsigned char> getData(::Windows::Storage::Streams::IBuffer^ buf) 
{ 
    auto reader = ::Windows::Storage::Streams::DataReader::FromBuffer(buf); 

    std::vector<unsigned char> data(reader->UnconsumedBufferLength); 

    if (!data.empty()) 
     reader->ReadBytes(
      ::Platform::ArrayReference<unsigned char>(
       &data[0], data.size())); 

    return data; 
} 

Daha fazla bilgi için bkz. Array and WriteOnlyArray (C++/CX). İstersen, bir yan not olarak> IBuffer
CryptographicBuffer.CreateFromByteArray

-> Platform :: Dizi
CryptographicBuffer.CopyToByteArray

Platformu :: Dizi -

IBuffer:

9

Ayrıca bu yöntemi kontrol Platform::ArrayReference'u kullanabileceğiniz basit C++ dizisinden Platform::Array oluşturmak, örneğin:

char* c = "sdsd"; 
Platform::ArrayReference<unsigned char> arraywrapper((unsigned char*) c, sizeof(c)); 
+0

Teşekkürler bu bana bir baş ağrısı kurtardı !, referans için, ArrayReference Platform ad alanında. –

+1

UYARI: sizeof (c) dizginin uzunluğunu değil işaretçinin boyutunu üretecektir. –

3

Bu WinRT uzantıları ile çalışması gerekir:

// Windows::Storage::Streams::DataReader 
// buffer is assumed to be of type Windows::Storage::Streams::IBuffer 
// BYTE = unsigned char 

DataReader^ reader = DataReader::FromBuffer(buffer); 

BYTE *extracted = new BYTE[buffer->Length]; 

// NOTE: This will read directly into the allocated "extracted" buffer 
reader->ReadBytes(Platform::ArrayReference<BYTE>(extracted, buffer->Length)); 

// ... do something with extracted... 

delete [] extracted; // don't forget to free the space 
+0

Platform :: ArrayReference hakkında neredeyse hiç belge yok. Bu bilgiyi nereden bulabilirdiniz? –

+2

MSDN https://msdn.microsoft.com/en-us/library/hh700131.aspx adresinden bir örnek: "Verilerin kopyalanmasını önlemek için ArrayReference kullan" –

İlgili konular