質問

どのように使用できますか Safearray C ++からC#に一連のカスタムタイプ(プロパティのみを含むクラス)を渡すには?を使用しています VT_RECORD それを行うための正しい方法を入力しますか?

私は次の方法で試していますが、 SafeArrayPutElement Safearrayを埋めようとするときにエラーを返します クラスの配列への参照は、nullとして管理されたコードに到達します。

私は管理された世界で次のようなものを持っています:

[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 ポインターである必要がありますよね?)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top