View Full Version : سوال: SAFEARRAY چیست؟
ostovarit
شنبه 21 اسفند 1389, 16:59 عصر
SAFEARRAY چیست؟ چطور مقداری درش ذخیره میشه؟
و چطور مقادیرش رو بخونیم ...؟
من کد زیر رو دارم که متد صدا زده شده در یک SAFEARRAY ریخته میشه چطور میتونم مقادیرش رو بخونم؟
(سرچ کردم نتیجه نداد)
SAFEARRAY* sa = CardFuncs->testStringArray();
توضیح بیشتر: تابع testStringArray در dll ی به زبان سی شارپ نوشته شده و مقدار بازگشی متد StringArray تعریف شده که در C++ مقدار SAFEARRAY بر می گرداند.
ostovarit
یک شنبه 22 اسفند 1389, 10:26 صبح
خوب کسی که جواب نداد خودم جواب میدم (این تالار یک اقای موسوی رو داره که بعضی وقتا جواب میده و کلاخیلی خلوته ...)
این همه منبع کامل واسه سی شارپ داریم اما وقتی میخوام درمورد سی یا سی پلاس پلاس مطلبی پیدا کنم جونم بالا می یاد تا یک نمونه کد گیر بیارم و بفهمم!!!! مثلا درباره همین SAFEARRAY مطلب زیاد بود ولی من لینک زیر رو متوجه شدم و تونستم ازش جواب بگیرم .... پیشنهاد می کنم این لینک رو مطالعه کنید.
http://www.codeproject.com/KB/atl/safearray_macro.aspx
کدی که برای برنامم نوشتم اینه:
LONG lstart, lend;
SAFEARRAY* sa = CardFuncs->testStringArray();
LONG idx = -1;
LONG nPos;
HRESULT hr2;
BSTR* pbstr;
hr2 = SafeArrayAccessData(sa,(void HUGEP**)&pbstr);
if(SUCCEEDED(hr2))
{
for(idx=lstart; idx <= lend; idx++)
{
CComBSTR s;
s = pbstr[idx];
.
.
.
// s now contains the item at position idx in the array
// ...
}
hr2 = SafeArrayUnaccessData(sa);
if(FAILED(hr2)) return hr2;
}
else
return hr2;
البته یک سری پارامترها اینجا اضافست دیگه خلوتش نکردم ..........
mehdi.mousavi
دوشنبه 23 اسفند 1389, 13:47 عصر
سلام.
با فرض به اینکه مقدار بازگشتی تابع شما آرایه ای از BSTR ها باشه، می تونید با استفاده از کلاس CComSafeArray (که در atlsafe.h تعریف شده) بدین شکل عمل کنید:
CComSafeArray<BSTR> safeArray(res);
for(int i = 0; i < safeArray.GetCount(0); i++)
{
CComBSTR bstr(safeArray[i]);
}
بدین ترتیب دیگه نیازی به مدیریت دسترسی به SAFEARRAY نیز ندارید، چون CComSafeArray کنترل های لازم رو برای شما انجام میده.
موفق باشید.
پاورقی: در کد فوق، فرض کردم مقدار بازگشتی آرایه ای یک بعدی هستش و نتیجه اش در متغیر res ذخیره شده!
Update: سوال اصلی رو فراموش کردم جواب بدم. SAFEARRAY چیه؟ Structure ای برای نقل و انتقال آرایه ای از Data Type های از پیش تعیین شده که طول آرایه نیز در درون Structure نگهداری میشه. مورد استفاده اش هم Marshaling داده ها در OLE Automation و ... هستش.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.