تمرير صفيف سلسلة [] مُدار (C#) إلى COM DLL
سؤال
يثبت:
لدي COM DLL يستدعي طريقة داخل C# DLL المُدارة.تقوم هذه الدالة بإرجاع صفيف سلسلة C#[]، والذي تم تنظيمه إلى SAFEARRAY.
مشكلة:
عندما أحاول الوصول إلى السلاسل داخل المصفوفة الآمنة، أحصل فقط على الحرف الأول من السلسلة.ما الخطأ الذي افعله؟
الرمز:
// Pointer to the managed interface
DatabasePtr pODB(__uuidof(DBClass));
// Get the string[] array from the managed method
SAFEARRAY* safearray = pODB->GetStringArray();
HRESULT hresult;
long ubound;
long lbound;
hresult = SafeArrayGetUBound(safearray, 1, &ubound);
hresult = SafeArrayGetLBound(safearray, 1, &lbound);
long index;
BSTR fromarray;
for (; lbound <= ubound; lbound++)
{
index = lbound;
hresult = SafeArrayGetElement(safearray, &index, (void*)&fromarray);
char buffer[512];
sprintf_s(buffer,"%s",fromarray);
MessageBox(0, (LPCSTR)buffer, "...", 0);
}
شكرا لمساعدتك،
-شون!
المحلول
BSTR عبارة عن سلسلة Unicode، لذا يجب عليك استخدام wchar_t
المخزن المؤقت و wsprintf_s
.الآن تقوم بطباعة جزء ANSI من أول حرف Unicode ثم تتوقف عند \0.ومن فضلك، من فضلك، لا تكدس الفائض بهذه الطريقة (هكذا!).استخدم الخزنة _vsnwprintf_s_l
وعائلتها، الكود الخاص بك هو متعة للهاكر كما هو الآن وسوف يتم اختراقك.يرى http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx
لا تنتمي إلى StackOverflow