2011-08-04 33 views
2

C++のinterop(マーシャル)を管理してC++からC#にイメージを送信しようとしています。 image->getStream()文字列からconst char*を返します。const char *からバイト配列にコピーするC++/c#interop Marshal :: Copy

私のMarshal::Copy機能で例外があります。

タイプ'System.AccessViolationException'の未処理の例外は

がmscorlib.dllで発生しました追加情報:保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。

私はconst char*からバイト配列にコピーのための正しいことをしていますか?私のDLLは、VS2010で設定されたASCII文字でコンパイルされています。

array<System::Byte>^ OsgViewer::getLastImage() 
{ 
    array<Byte>^ byteArray; 

    m_ImageQueue->lock(); 

    int index = m_ImageQueue->getCurrentImageIndex(); 
    std::shared_ptr<Image> image = m_ImageQueue->getImage(static_cast<unsigned int>(index)); 
    if(image && image->isValid() == true) 
    { 
     int wLen = image->getStreamSize(); 
     char* wStream = const_cast<char*>(image->getStream()); 
     byteArray = gcnew array<Byte>(wLen); 

     // convert native pointer to System::IntPtr with C-Style cast 
     Marshal::Copy((IntPtr)wStream ,byteArray , 0, wLen); 
    } 

    m_ImageQueue->unlock(); 
    return byteArray; 
} 

画像は、自宅では、C++クラスI元帥::コピーを使用することはありません

class ADAPTER Image 
{ 
public : 
    Image(); 
    ~Image(); 
    const char* getStream() const; 
    int getStreamSize(); 
    bool setStringStream(std::ostringstream* iStringStream); 
    void setIsValid(bool isValid){ m_isValid = isValid;} 
    bool isValid() const{return m_isValid;} 
    std::ostringstream* getOStringStream() {return m_StringStream;} 
private: 
    std::ostringstream* m_StringStream; 
    bool m_isValid; 
}; 
+0

どのようなタイプの画像ですか? getStream()またはgetStreamSize()を持たないSystem.Drawing.Imageです。私はあなたの問題の根源は、ストリームはバイト配列ではないと思います。 – shf301

+0

上記のコードを見て、私は画像コード – BuzBuza

+0

を投稿しました。私の推測では、 'wStream'は' wLen'バイト長ではありません。あなたから本当に分かることはできません。 'char temp = wStream [wLen-1]'を追加すると、アクセス違反が発生しますか? – shf301

答えて

8

ました。ローカルに配列があるので、ピンを固定してmemcpyを使用するのはなぜですか?

pin_ptr<Byte> ptrBuffer = &byteArray[byteArray->GetLowerBound(0)]; 

あなたは今ptrBuffermemcpyを呼び出すことができます。

スコープが終了すると、ピニングが自動的に元に戻されます。

+2

これは、Marshal.Copyよりもはるかに高速で、@AresAvatarはスコープを失うと自動的に固定解除されるため、GCを傷つけることはありません。 –

+0

ありがとうございました。私はmemcpyを使いました。私は直接byteArrayへのコピーを作成します。 memcpy(byteArray、wStream、wLen)私のwStreamがostringstream.str()。c_str()によって返されたローカルconst char *へのポインタであるという問題がありました。 str()はバッファコピーを返しませんでした。 – BuzBuza

関連する問題