BYTE-Array in IStream



  • Also ... ich bekomm Daten von meiner Server app... als BYTE-Array... soweit kein Problem ... doch es handelt sich bei dem Array um Bilddaten, d.h. will ich diese Daten in einen IStream packen und diesen dann an Gdiplus::Image::FromStream übergeben... doch ich bekomms nicht richtig hin, die Daten des Arrays in nen Stream zu packen 😕 Hat da jemand nen Lösungsvorschlag? Was ich versucht hab hat net gaanz so geklappt ...

    /* 
    LoadImage:
       - lpbyData: Zeiger auf BYTE-Array der die Bild-Daten enthält.
       - dwLen: größe des Arrays
    */
    bool dataPictureCtrl::LoadImage(LPCBYTE lpbyData, unsigned long dwLen)
    {
    	// m_pImage ist ein Pointer auf ein Gdiplus::Image
    	if (lpbyData == NULL)
    		return false;
    
    	if (m_pImage != NULL) 
    	{
    		delete m_pImage;
    		m_pImage = NULL;
    	}
    
        LPVOID	lpData	= NULL;
        HGLOBAL	hGlobal	= GlobalAlloc(GMEM_MOVEABLE, dwLen);
    
        if (hGlobal == NULL)
    		return false;
    
        lpData = GlobalLock(hGlobal);
    
        if (lpData == NULL)
        {
            GlobalUnlock(hGlobal);
            return false;
        }
    
    	memcpy(lpData, lpbyData, dwLen);
    
        GlobalUnlock(hGlobal);
    
        LPSTREAM lpStream = NULL;
    
        if (FAILED(CreateStreamOnHGlobal(hGlobal, TRUE, &lpStream)))
    	{
    		if (lpStream != NULL)
                lpStream->Release();
    
    		return false;
    	}
    
    	if (lpStream == NULL)
    		return false;
    
    	m_pImage = Gdiplus::Image::FromStream(lpStream);
    
    	if (m_pImage == NULL || m_pImage->GetLastStatus() != Gdiplus::Ok)
    	{
    		lpStream->Release();
    		return false;
    	}
    
    	lpStream->Release();
    
    	RedrawWindow();
    
    	return true;
    }
    

  • Mod

    Sieht doch gut aus. Was klappt denn nicht?
    Achte daruf, dass die Rückgabewerte (HRESULT) meistens wertvolle Infrmationen Infos geben.

    HRESULT hr;
    hr = Operation();
    if (FAILED(hr))
        ...
    

    Ist ein besserer Stil für die Fehlerkontrolle!



  • Hmm ok wenn das richtig wäre, müsste er das Bild ja anzeigen 😉
    Hmm das mit der Fehlerkontrolle werd ich machen ... die Funktion ist auch NOCH nicht fertig 😉 Die Fehlerüberprüfung(durch verschiedene returns 😉 ) kommt imma bei mir am ende 😉

    naja ... hmm k aber eigentlich müsste Invalidate(), RedrawWindow() oder InvalidateRect den ja eigentlich dazu bringen die WM_ERASEBACKGROUND nochmal aufzurufen... und dann würde GDI+ das ganze ja auch anzeigen... aber tuts nunmal nicht ... ich guck jetzt einfach mal was GetLastError meint ...


Anmelden zum Antworten