从应用程序中修改函数参数(指针)

时间:2009-06-15 13:16:38

标签: c pointers reference

这是一个基于Win32 C代码的问题。 在我的一个函数中,我有以下代码:

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 *缓冲区将保存到文件中。一切都好。 现在,我需要修改此代码,以便返回unsigned char *。类似的东西:

void SeparateStuff(unsigned char* ReturnedBytes)

其中将在函数内修改ReturnedBytes。 我试过复制指针,我试着复制指针内的数据。我尝试了很多不同的方法。无论我做什么,我都会在调用函数中获取垃圾或异常。 调用函数(例如main())必须传递给SeparateStuff()也是一个unsigned char *。

我该怎么做?

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用以下语法之一:

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

答案 1 :(得分:0)

SeparateStuff(&ReturnedBytes);

void SeparateStuff(unsigned char** ReturnedBytes)
{
    ...
}

答案 2 :(得分:0)

试试这个:

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

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

请确保所有参数都已正确初始化。此外,您必须保证GlobalLock返回的内容仍然存在。