C++のinterop(マーシャル)を管理してC++からC#にイメージを送信しようとしています。 image->getStream()
文字列からconst char*
を返します。const char *からバイト配列にコピーするC++/c#interop Marshal :: Copy
私のMarshal::Copy
機能で例外があります。
タイプ
がmscorlib.dllで発生しました追加情報:保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。'System.AccessViolationException'
の未処理の例外は
私は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;
};
どのようなタイプの画像ですか? getStream()またはgetStreamSize()を持たないSystem.Drawing.Imageです。私はあなたの問題の根源は、ストリームはバイト配列ではないと思います。 – shf301
上記のコードを見て、私は画像コード – BuzBuza
を投稿しました。私の推測では、 'wStream'は' wLen'バイト長ではありません。あなたから本当に分かることはできません。 'char temp = wStream [wLen-1]'を追加すると、アクセス違反が発生しますか? – shf301