2011-08-19 4 views
2

Gtiplus :: Image가 IStream에서 파생 된 개체 또는 파일 경로에만 저장하기 때문에 IStream 인스턴스에서 일부 바이너리 데이터를 복사하려고합니다. 할당 된 바이너리 크기를 알면 읽을 수있는 char 포인터가됩니다 포인터에 액세스 할 수 있습니다.IStream 인스턴스의 데이터를 char 포인터로 읽으려면 어떻게해야합니까?

char* pBuffer = upload->GetBinaryData(); 
buffer.write(pBuffer, upload->GetSize()); 

그러나 저장 메모리가 잘못이 (이상한 그것이 비록 패턴처럼 보인다 : 나는 이렇게 업로드 인스턴스를 처리하는 내 기능에서

Upload::Upload(Gdiplus::Bitmap* bitmap, CLSID clsEncoderId) 
{ 
    int result; 
    STATSTG statResult; 

    result = CreateStreamOnHGlobal(0, TRUE, &m_hBufferStream); 

    if (result != S_OK) 
     MessageBoxW(NULL, _T("Upload::Upload(): Could not create stream"), _T("Point"), MB_OK | MB_ICONERROR); 
    else 
    { 
     if (bitmap->Save(m_hBufferStream, &clsEncoderId, NULL) != Gdiplus::Ok) 
      MessageBoxW(NULL, _T("Upload::Upload(): Could not save() image"), _T("Point"), MB_OK | MB_ICONERROR); 
    } 

    if (m_hBufferStream->Stat(&statResult, STATFLAG_NONAME) != S_OK) 
     return; 

    Gdiplus::Image test(m_hBufferStream, TRUE); 
    test.Save(_T("hejs.png"), &clsEncoderId, NULL); 

    m_iSize = statResult.cbSize.LowPart; 
} 

char* Upload::GetBinaryData() 
{ 
    char* buffer = (char*)malloc(m_iSize); 
    ULONG size = 0; 

    m_hBufferStream->Read(buffer, m_iSize, &size); 

    return buffer; 
} 

다음과 같이

내 클래스입니다).

내가 뭘 잘못하고 있니?

미리 감사드립니다.

P.S. .: 테스트 Image-instance는 m_hBufferStream에서 읽은 후 파일에 성공적으로 저장됩니다.

답변

1

우선 IStream::Read()은 지정된 바이트 수를 정확하게 읽는 데 필요하지 않습니다. 그 수를 초과해서 읽지 않아도됩니다. 실제 번호는 세 번째 매개 변수가 가리키는 veriable 안에 저장됩니다.

두 번째로 HRESULTRead()으로 반환되었는지 확인하지 않습니다.

루프에서 Read()을 호출하고 반환 값을 확인하고 실제로 읽은 바이트 수에 따라 포인터를 버퍼로 조정하는 것이 훨씬 더 좋은 전략입니다.

관련 문제