2009-06-15 37 views
5

如何使用Safearray將自定義類型數組(僅包含屬性的類)從C++傳遞到C#?正在使用VT_RECORD類型正確的方式來做到這一點?將自定義類型的Safearray從C++傳遞到C#

我正在嘗試以下方式,但 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其他陣列兩個應用程序之間的問題。所以這是傳遞結構特有的東西。

斯特凡諾

+0

什麼是錯誤? – fretje 2009-06-15 07:56:30

回答

3

我真的不知道,如果我明白你的問題的權利,但也許你需要VT_DISPATCH? 我想如果你想要它與VT_RECORD一起工作,那麼你的結構實際上應該是一個結構(不是類),也需要[StructLayout(LayoutKind.Sequential)]屬性。

編輯:它可以是你第一次得到的錯誤是DISP_E_BADINDEX?你的代碼中究竟是什麼indices?它包含什麼? (你知道SafeArrayPutElement的簽名要求它是一個指針,對嗎?)

+0

任何可以完成工作的事情都可以與我一起;) 僅從名稱判斷,VT_RECORD似乎是我正在嘗試完成的最接近的選項。我只需要能夠將這個結構/類暴露給非託管代碼來填充它。 – 2009-06-15 08:30:15

+0

您可以詳細說明您的當前解決方案如何完全失敗?一個錯誤消息可能? – fretje 2009-06-15 08:49:19

+0

*詳細說明課程;-) – fretje 2009-06-15 08:49:50