2012-09-18 36 views
10

làm thế nào để lặp qua con trỏ an toàn C++ tới con trỏ và truy cập các phần tử của nó.Làm thế nào để lặp qua SAFEARRAY **

tôi đã cố gắng để nhân rộng các giải pháp đăng bởi Lim Bio Liong http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602 nhưng điều kỳ lạ là các phương pháp chữ ký IDL đi ra được

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

thay vì

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

Bất kỳ ý tưởng ?

cảm ơn trước

+0

'cmd' là gì? ! –

Trả lời

21

Safearrays được tạo với SafeArrayCreate hoặc SafeArrayCreateVector, nhưng khi bạn hỏi về lặp qua SAFEARRAY, giả sử bạn đã có SAFEARRAY được trả về bởi một số hàm khác. Một cách là sử dụng API SafeArrayGetElement đặc biệt thuận tiện nếu bạn có SAFEARRAY nhiều chiều, vì nó cho phép, IMO, dễ dàng xác định các chỉ số một chút.

Tuy nhiên, đối với vectơ (SAFEARRAY một chiều), việc truy cập dữ liệu trực tiếp và lặp qua các giá trị sẽ nhanh hơn. Dưới đây là ví dụ:

Giả sử đó là SAFEARRAY của long s, tức là. 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() không thuộc về mã này. Không phá hủy mảng nếu bạn không sở hữu nó. –

+0

'lấy chúng từ đâu đó 'có nghĩa là biểu thị một kịch bản điển hình của việc có phương thức trả về SAFEARRAY như tham số' [out] 'trong trường hợp máy khách chịu trách nhiệm dọn dẹp, nhưng điều đó có thể không rõ ràng. Tôi đã chỉnh sửa câu trả lời –

+0

Tôi làm cách nào để truy cập Safearray khi tôi có 2 thứ nguyên? – savi

3

MSDN SafeArrayGetElement function cung cấp cho bạn một đoạn mã trên sử dụng SafeArrayGetElement để có được đối tượng cá nhân để mảng. Các hàm

SAFEARRAY structureSafeArray* giải thích API khả dụng.

Trong dự án ATL/MFC, bạn sẽ muốn sử dụng các lớp trình bao bọc, ví dụ: CComSafeArray để làm cho mọi việc đơn giản và dễ dàng hơn. Xem Simplifying SAFEARRAY programming with CComSafeArray về điều này.

+0

Liên kết cuối cùng của bạn bị hỏng. –

+0

@SimonMourier: Cảm ơn, tôi đã thay thế bằng liên kết được lưu trong bộ nhớ cache, tôi không chắc liệu nội dung gốc không có sẵn vĩnh viễn hay tạm thời. –

+1

Tôi tìm thấy nó ở đây nếu: https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray/ với sự giúp đỡ của google –

Các vấn đề liên quan