2009-06-15 15 views
5

से कस्टम प्रकारों का एक सफेयर पास करना C++ से C# तक कस्टम प्रकारों (केवल गुण वाले वर्ग) की सरणी पास करने के लिए Safearray का उपयोग कैसे कर सकता है? VT_RECORD का उपयोग कर ऐसा करने का सही तरीका है? जब SAFEARRAY कक्षाओं की सरणी के संदर्भ में एक शून्य के रूप में प्रबंधित कोड के लिए हो जाता है को भरने की कोशिश कर रहासी ++ से सी #

मैं निम्नलिखित तरीके से कोशिश कर रहा हूँ, लेकिन SafeArrayPutElement एक त्रुटि देता है।

मैं कामयाब दुनिया में निम्नलिखित की तरह कुछ है:

[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 की अन्य सारणियों पारित करने के लिए दो अनुप्रयोगों के बीच समस्याएं। तो यह एक संरचना पारित करने के लिए कुछ असाधारण है।

Stefano

+0

त्रुटि क्या है? – fretje

उत्तर

3

मैं सच में यकीन है कि अगर मैं अपने प्रश्न सही समझ में नहीं हूँ, लेकिन हो सकता है आप VT_DISPATCH की ज़रूरत है? मुझे लगता है कि यदि आप इसे VT_RECORD के साथ काम करना चाहते हैं, तो आपकी संरचना वास्तव में एक संरचना (कक्षा नहीं) होनी चाहिए और [StructLayout(LayoutKind.Sequential)] विशेषता की भी आवश्यकता होनी चाहिए।

संपादित करें: क्या यह हो सकता है कि आपको पहली बार मिली त्रुटि DISP_E_BADINDEX थी? आपके कोड में indices क्या है? इसमें क्या शामिल है? (आप जानते हैं कि SafeArrayPutElement के हस्ताक्षर के लिए यह एक सूचक होना चाहिए, है ना?)

+0

जो कुछ भी काम करता है वह मेरे साथ ठीक है;) केवल नाम से जुडिंग, VT_RECORD जो मैं पूरा करने की कोशिश कर रहा हूं उसके निकटतम विकल्प प्रतीत होता था। मुझे बस इस संरचना/कक्षा को अप्रबंधित कोड में इसे पॉप्युलेट करने के लिए बेनकाब करने में सक्षम होना चाहिए। –

+0

क्या आप इस बात पर elabore कर सकते हैं कि आपका वर्तमान समाधान वास्तव में विफल रहता है? एक त्रुटि संदेश शायद? – fretje

+0

* पाठ्यक्रम से विस्तृत करें ;-) – fretje

संबंधित मुद्दे