изменение параметра функции (указателя) из приложения - PullRequest
0 голосов
/ 15 июня 2009

Это вопрос, основанный на коде C для Win32. В одной из моих функций у меня есть следующий код:

void SeparateStuff()
{
    HGLOBAL hMem;
    IStream* pStream;
    Status result;
    unsigned char* pBytes;
    DWORD size;
    FILE* fp;

    if (hMem = GlobalAlloc(GMEM_MOVEABLE, 0))
    {

        if (CreateStreamOnHGlobal(hMem, FALSE, &pStream) == S_OK)
        {
        // save the buffer to a file    
        result = Scramble(pStream);  
        pStream->Release();

        if (result == Ok)
        { 
            if (pBytes = (unsigned char *) GlobalLock(hMem))
            {
                                size = GlobalSize(hMem);
                                // pBytes has the buffer now
                                // in this case write it to a file
                                if(fp = fopen("c:\\SomeFile.bin", "wb"))
                                {
                                    fwrite(pBytes, size, 1, fp);
                                    fclose(fp);
                                }
                }
            }

        }
        else
        {
            printf("error CreateStreamOnHGlobal. Last err: %d\n",  GetLastError());
            return;
        }
    }
    else
    {
        printf("error GlobalAlloc. Last err: %d\n", GetLastError());
        return;
    }
}  

В этом случае буфер unsigned char * сохраняется в файл. Все отлично. Теперь мне нужно изменить этот код, чтобы беззнаковый символ * возвращался. Что-то вроде:

void SeparateStuff(unsigned char* ReturnedBytes)

Где ReturnedBytes будет изменено внутри функции. Я попытался скопировать указатель, я попытался скопировать данные внутри указателя. Я пробую много разных подходов. Неважно, что я делаю, я получаю мусор в вызывающей функции или исключение. Вызывающая функция (например, main ()) должна передать SeparateStuff () также беззнаковый символ *.

Как мне это сделать?

спасибо!

Ответы [ 3 ]

0 голосов
/ 15 июня 2009
SeparateStuff(&ReturnedBytes);

void SeparateStuff(unsigned char** ReturnedBytes)
{
    ...
}
0 голосов
/ 15 июня 2009

Попробуйте это:

void SeparateStuff(unsigned char **handleToBuffer)
{
    ...

    if (*handleToBuffer = (unsigned char *) GlobalLock(hMem))
    {
        ...
    }
    else
    {
        return;
    }
    ...
}

Пожалуйста, убедитесь, что все аргументы правильно инициализированы. Также вы должны гарантировать, что то, что возвращает GlobalLock, останется там.

0 голосов
/ 15 июня 2009

Вы можете использовать один из следующих синтаксисов:

unsigned char* SeparateStuff(); //Returns a pointer
void SeparateStuff(unsigned char** ppBuffer); //Pointer to the output buffer

Или в C ++:

void SeparateStuff(unsigned char*& pBuffer) //Reference to the output buffer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...