2009-06-15 12 views
5

に渡す方法Safearrayを使用して、カスタムタイプの配列(プロパティのみを含むクラス)をC++からC#に渡すにはどうすればよいですか? VT_RECORDタイプを正しい方法で使用していますか?カスタムタイプのSafearrayをC++からC#

私は次のようにしていますが、 SafeArrayPutElementはsafeearrayを埋めるときにエラーを返します クラスの配列への参照は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]++; 
} 

をノーとBSTRの他の配列を渡すことができ、使用SafeArrayだということに注意してください2つのアプリケーション間の問題これは構造を渡すことに特有のものです。

ステファノ

+0

エラーは何ですか? – fretje

答えて

3

は、私は右のあなたの質問を理解している場合は本当にわからないんだけど、多分あなたはVT_DISPATCHが必要ですか? VT_RECORDで動作させたい場合は、構造体は実際に構造体(クラスではない)でなければならず、[StructLayout(LayoutKind.Sequential)]属性も必要です。

:最初に取得したエラーはDISP_E_BADINDEXでしたか?あなたのコードにはindicesとは何ですか?それには何が含まれていますか? (あなたはSafeArrayPutElementの署名がそれをポインタにする必要があることを知っていますか?)

+0

仕事を終わらせるものは何でも構いません;) 名前からのみジャッジすると、VT_RECORDは私が達成しようとしていることに最も近い選択肢でした。私は、この構造体/クラスをアンマネージコードに公開して、それを設定する必要があります。 –

+0

あなたの現在のソリューションがいかに正確に失敗するかについて、あなたは熟考できますか?エラーメッセージかもしれない? – fretje

+0

*精巧なコースから;-) – fretje

関連する問題