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に変換するのですか?
ありがとうございます。
コンパイルに使用したコードは本当ですか? – DavidG
このコンポーネントの作成者がこのCOMコンポーネントのIDLを変更したように見えます。これで、型ライブラリインポータはバイト配列であることを(正しく)認識できます。通常、プログラマは、[uuid]を変更せずにインターフェースを変更することは、かなり総体的なDLLのヘルイントロデューサであるにもかかわらず、問題の代わりにこれを解決すると考えています。著者に相談するか、それに応じてクライアントコードを修正してください。 –
@HansPassant、私は真剣に興味を持っています - 「クライアントコードをそれに合わせて調整する」ということは私の答えとは違っていますか?私はここで何が欠けていますか? –