C ++からC#にカスタムタイプのサフェレーを渡す
-
13-09-2019 - |
質問
どのように使用できますか Safearray
C ++からC#に一連のカスタムタイプ(プロパティのみを含むクラス)を渡すには?を使用しています VT_RECORD
それを行うための正しい方法を入力しますか?
私は次の方法で試していますが、 クラスの配列への参照は、nullとして管理されたコードに到達します。SafeArrayPutElement
Safearrayを埋めようとするときにエラーを返します
私は管理された世界で次のようなものを持っています:
[ComVisible(true)]
public interface IStatistics
{
double Mean { get; set; }
double StdDev { get; set; }
}
[Serializable]
[ComVisible(true)]
public class Statistics : IStatistics
{
public Mean { get; set; }
public double StdDev { get; set; }
}
管理されていない世界:
HRESULT hr = CoInitialize(NULL);
...
SAFEARRAY *pEquationsStatistics;
// common dimensions for all arrays
SAFEARRAYBOUND dimensions[1];
dimensions[0].cElements = 2;
dimensions[0].lLbound = 0;
pEquationsStatistics = SafeArrayCreate(VT_RECORD, 1, dimensions);
...
for (long i = 0; i < dimensions[0].cElements; i++)
{
long indices[1];
indices[0] = 0;
...
// Equation statistics
IStatisticsPtr pIStatistics(__uuidof(Statistics));
pIStatistics->PutMean(1.0); // so far so good
result = SafeArrayPutElement(pEquationsStatistics, indices, pIStatistics);
...
indices[0]++;
}
私が使用できることに注意してください SafeArray
の他の配列を渡す BSTR
2つのアプリケーション間に問題はありません。したがって、これは構造を渡すのに特有のものです。
ステファノ
解決
あなたの質問を正しく理解しているかどうかは本当にわかりませんが、多分あなたは必要です VT_DISPATCH
?あなたがそれを一緒に働かせたいなら私は思う VT_RECORD
, 、その後、あなたの構造体は実際に構造体である必要があり(クラスではありません)、 [StructLayout(LayoutKind.Sequential)]
属性。
編集: :あなたが最初に得たエラーは DISP_E_BADINDEX
?正確には何ですか indices
あなたのコードで?それには何が含まれていますか? (あなたはの署名を知っています SafeArrayPutElement
ポインターである必要がありますよね?)
所属していません StackOverflow