سؤال

يثبت:
لدي 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top