2017-03-03 8 views
0

私は誰かが助けてくれることを願っています。 VS2012でコンパイルするために使用次のコード:バイト[]をSAFEARRAYに変換する

STDMETHODIMP CGatherStore::GetPathBmp(ULONGLONG sessionID, LONG *pWidth, LONG *pHeight, SAFEARRAY **pData) 
{ 
    m_dbOps.OpenDatabase(m_depository); 
    if (m_dbOps.HasPath(sessionID)) 
    { 
    SessionData sd(m_dbOps.GetSessionPath(sessionID)); 

    *pWidth = sd.pathHeader.bcWidth; 
    *pHeight = sd.pathHeader.bcHeight; 

    CComSafeArray<BYTE> bmpArray; 
    CComSafeArrayBound bounds; 

    *pData = SafeArrayCreate(VT_UI1, 1, &bounds); 
    if (sd.spPathRawData.m_p != NULL) 
    { 
     bmpArray.Attach(*pData); 
     bmpArray.Add(sd.GetPathSize(), reinterpret_cast<BYTE *>(sd.spPathRawData.m_p), true); 
     bmpArray.Detach(); 
    } 
    } 
    else 
    { 
    CComSafeArrayBound bounds; 

    *pData = SafeArrayCreate(VT_UI1, 1, &bounds); 
    } 

    return S_OK; 
} 

次のようにエクスポートされた宣言は次のとおりです。

void GetPathBmp(ulong sessionid, out int pWidth, out int pHeight, out Array pData); 

次のようにそれを呼び出す関数は、次のとおりです。

public WriteableBitmap GetBitmapPath(ulong sessionID) 
{ 
    WriteableBitmap bmp = null; 

    try 
    { 
    int width; 
    int height; 
    byte[] data; 

    gs.GetPathBmp(sessionID, out width, out height, out data); 
    bmp = BitmapFactory.New(width, height); 
    bmp.FromByteArray(data); 
    } 
    catch (Exception e) 
    { 
    System.Diagnostics.Trace.WriteLine(String.Format("GetBitmapPath failed, session ID {0} - {1}", sessionID, e.Message)); 
    } 

    return bmp; 
} 

しかし、ときに私がしてみてくださいVS2015でコンパイルすると、次のエラーメッセージが表示されます。

error CS1503: Argument 4: cannot convert from 'out byte[]' to 'out System.Array' 

どのように変数をbyte []からSAFEARRAYに変換するのですか?

ありがとうございます。

+2

コンパイルに使用したコードは本当ですか? – DavidG

+1

このコンポーネントの作成者がこのCOMコンポーネントのIDLを変更したように見えます。これで、型ライブラリインポータはバイト配列であることを(正しく)認識できます。通常、プログラマは、[uuid]を変更せずにインターフェースを変更することは、かなり総体的なDLLのヘルイントロデューサであるにもかかわらず、問題の代わりにこれを解決すると考えています。著者に相談するか、それに応じてクライアントコードを修正してください。 –

+0

@HansPassant、私は真剣に興味を持っています - 「クライアントコードをそれに合わせて調整する」ということは私の答えとは違っていますか?私はここで何が欠けていますか? –

答えて

0

次のように私は、呼び出し元の関数を変更:

public WriteableBitmap GetBitmapPath(ulong sessionID) 
{ 
    WriteableBitmap bmp = null; 
    try 
    { 
    int   width; 
    int   height; 
    System.Array sa; 

    gs.GetPathBmp(sessionID, out width, out height, out sa); 
    bmp = BitmapFactory.New(width, height); 

    byte[] data = new byte[sa.Length]; 
    sa.CopyTo(data, 0); 
    bmp.FromByteArray(data); 
    } 
    catch (Exception e) 
    { 
    System.Diagnostics.Trace.WriteLine(String.Format("GetBitmapPath failed, session ID {0} - {1}", sessionID, e.Message)); 
    } 
    return bmp; 
} 

動作するようです。誰もが助けてくれてありがとう。

関連する問題