Данные SAFEARRAY для неподписанного символа * - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь преобразовать указатель данных SAFEARRAY в unsinged char*. Однако я не получаю ожидаемых данных. Вот фрагмент.

SafeArrayLock(psaFrameData);
psaFrameData->rgsabound->cElements;
int nCount = psaFrameData->rgsabound->cElements -   psaFrameData->rgsabound->lLbound + 1;
frameData = new unsigned char[nCount];
memset(frameData, 0, nCount);

for (int i = 0; i < nCount; ++i)
{
    frameData[i] = ((unsigned char*)(psaFrameData)->pvData)[i];
}    
SafeArrayUnlock(psaFrameData);

1 Ответ

0 голосов
/ 22 июня 2019

Не блокируйте массив вручную, а затем обращайтесь к его pvData (или к любому из его других элементов данных) напрямую. Вместо этого используйте различные функции доступа, такие как SafeArrayAccessData():

Увеличивает количество блокировок массива и получает указатель на данные массива.

Попробуйте что-то еще подобное:

// safety check: make sure the array has only 1 dimension...
if (SafeArrayGetDim(psaFrameData) != 1)
{
    // handle the error ...
}
else
{
    // safety check: make sure the array contains byte elements...
    VARTYPE vt = 0;
    SafeArrayGetVartype(psaFrameData, &vt);
    if (vt != VT_UI1)
    {
        // handle the error ...
    }
    else
    {
        // get a pointer to the array's byte data...
        unsigned char *data;
        if (FAILED(SafeArrayAccessData(psaFrameData, (void**)&data)))
        {
            // handle the error ...
        }
        else
        {
            // calculate the number of bytes in the array...
            LONG lBound, uBound;
            SafeArrayGetLBound(psaFrameData, 1, &lBound);
            SafeArrayGetUBound(psaFrameData, 1, &uBound);
            long nCount = uBound - lBound + 1; 

            // copy the bytes...
            frameData = new unsigned char[nCount];
            memcpy(frameData, data, nCount);

            // release the pointer to the array's byte data...
            SafeArrayUnaccessData(psaFrameData);
        }
    }
}
...