2012-09-18 4 views
10

के माध्यम से पुन: प्रयास कैसे करें पॉइंटर पर C++ safearray पॉइंटर के माध्यम से पुन: प्रयास करें और इसके तत्वों तक पहुंचें।SAFEARRAY **

मैं समाधान http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602 लिम जैव Liong द्वारा पोस्ट की गई लेकिन अजीब बात यह है कि आईडीएल विधि हस्ताक्षर बाहर आता है

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY ** test_struct_array); 
बजाय

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY(TestStruct)* test_struct_array); 

कोई भी विचार हो रहा है दोहराने की कोशिश की ? पहले से

धन्यवाद

+0

'cmd' क्या है? ! –

उत्तर

21

Safearrays SafeArrayCreate या SafeArrayCreateVector के साथ बनाए जाते हैं, लेकिन जैसा कि आप एक सुरक्षितता पर पुनरावृत्ति के बारे में पूछते हैं, मान लीजिए कि आपके पास पहले से ही किसी अन्य फ़ंक्शन द्वारा सुरक्षित सुरक्षा है। एक तरीका है SafeArrayGetElement एपीआई का उपयोग करना जो विशेष रूप से सुविधाजनक है यदि आपके पास बहुआयामी सुरक्षा है, क्योंकि यह आईएमओ को इंडेक्स को निर्दिष्ट करने में थोड़ा आसान है।

हालांकि, वैक्टरों के लिए (अप्रत्याशित सुरक्षा) डेटा को सीधे एक्सेस करने और मूल्यों पर पुन: प्रयास करने के लिए तेज़ है। यहां एक उदाहरण दिया गया है:

मान लें कि यह long एस का एक सुरक्षित है, यानी। VT_I4

// get them from somewhere. (I will assume that this is done 
// in a way that you are now responsible to free the memory) 
SAFEARRAY* saValues = ... 
LONG* pVals; 
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory 
if (SUCCEEDED(hr)) 
{ 
    long lowerBound, upperBound; // get array bounds 
    SafeArrayGetLBound(saValues, 1 , &lowerBound); 
    SafeArrayGetUBound(saValues, 1, &upperBound); 

    long cnt_elements = upperBound - lowerBound + 1; 
    for (int i = 0; i < cnt_elements; ++i) // iterate through returned values 
    {        
    LONG lVal = pVals[i]; 
    std::cout << "element " << i << ": value = " << lVal << std::endl; 
    }  
    SafeArrayUnaccessData(saValues); 
} 
SafeArrayDestroy(saValues); 
+5

SafeArrayDestroy() इस कोड में नहीं है। यदि आपके पास इसका स्वामित्व नहीं है तो सरणी को नष्ट न करें। –

+0

'उन्हें कहीं से प्राप्त करें' का मतलब एक सुरक्षित परिदृश्य को इंगित करने के लिए किया गया था, जिसमें एक सुरक्षा को '[आउट]' पैरामीटर के रूप में वापस करने का तरीका है, जिसमें क्लाइंट क्लीनअप के लिए ज़िम्मेदार है, लेकिन यह स्पष्ट नहीं हो सकता है। मैंने जवाब –

+0

संपादित किया है जब मेरे पास 2 आयाम हैं तो मैं सफेरेरे का उपयोग कैसे करूं? – savi

3

MSDN SafeArrayGetElement function आप SafeArrayGetElement का उपयोग कर सरणी के लिए अलग-अलग वस्तु प्राप्त करने के लिए पर एक कोड स्निपेट देता है।

SAFEARRAY structure और SafeArray* फ़ंक्शंस उपलब्ध API की व्याख्या करते हैं।

एटीएल/एमएफसी परियोजना में आप रैपर वर्गों का उपयोग करना चाहते हैं उदा। चीजों को सरल और आसान बनाने के लिए CComSafeArray। इस पर Simplifying SAFEARRAY programming with CComSafeArray देखें।

+0

आपका अंतिम लिंक टूटा हुआ है। –

+0

@ सिमोनमोरीयर: धन्यवाद, मैंने एक कैश किए गए लिंक के साथ प्रतिस्थापित किया है, मुझे यकीन नहीं है कि संरेखण सामग्री स्थायी रूप से या अस्थायी रूप से उपलब्ध नहीं है या नहीं। –

+1

मुझे यह यहां मिला है अगर: https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray/ Google मदद –