<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[GIF in RicheditOle]]></title><description><![CDATA[<p>Hi</p>
<p>also ich habs jetzt endlich hinbekommen ein BMP in mein Richeditole zu bringen!!! Jetzt will ich aber, dass da ein animiertes Gif erscheint!<br />
Ich benutze dazu TGifImage, von der torry seite! Aber bekomme immer Fehler!<br />
Hier mal der alte Code, wie würdet ihr das machen?</p>
<pre><code class="language-cpp">pRichEditOle = NULL;
        ::SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&amp;pRichEditOle);
hBitmap = (HBITMAP) LoadImage(NULL, TEXT(Edit1-&gt;Text.c_str()), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CImageDataObject::InsertBitmap(pRichEditOle, hBitmap);

und jetzt die Insert bitmap methode!!!!!
class CImageDataObject : IDataObject
{
public:
    // This static function accepts a pointer to IRochEditOle
    //   and the bitmap handle.
    // After that the function insert the image in the current
    //   position of the RichEdit
    //
    static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP *hBitmap)
    {
        SCODE sc;

        // Get the image data object
        //
        CImageDataObject *pods = new CImageDataObject;
        LPDATAOBJECT lpDataObject;
        pods-&gt;QueryInterface(IID_IDataObject, (void **)&amp;lpDataObject);

        pods-&gt;SetBitmap(hBitmap);

        // Get the RichEdit container site
        //
        IOleClientSite *pOleClientSite;
        pRichEditOle-&gt;GetClientSite(&amp;pOleClientSite);

        // Initialize a Storage Object
        //
        IStorage *pStorage;

        LPLOCKBYTES lpLockBytes = NULL;
        sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &amp;lpLockBytes);

        sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
            STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &amp;pStorage);
        if (sc != S_OK)
        {
            lpLockBytes = NULL;
        }

        // The final ole object which will be inserted in the richedit control
        //
        IOleObject *pOleObject;
        pOleObject = pods-&gt;GetOleObject(pOleClientSite, pStorage);

        // all items are &quot;contained&quot; -- this makes our reference to this object
        //  weak -- which is needed for links to embedding silent update.
        OleSetContainedObject(pOleObject, TRUE);

        // Now Add the object to the RichEdit
        //
        REOBJECT reobject;
        ZeroMemory(&amp;reobject, sizeof(REOBJECT));
        reobject.cbStruct = sizeof(REOBJECT);

        CLSID clsid;
        sc = pOleObject-&gt;GetUserClassID(&amp;clsid);

        reobject.clsid = clsid;
        reobject.cp = REO_CP_SELECTION;
        reobject.dvaspect = DVASPECT_CONTENT;
        reobject.poleobj = pOleObject;
        reobject.polesite = pOleClientSite;
        reobject.pstg = pStorage;

        // Insert the bitmap at the current location in the richedit control
        //
        pRichEditOle-&gt;InsertObject(&amp;reobject);

        // Release all unnecessary interfaces
        //
        pOleObject-&gt;Release();
        pOleClientSite-&gt;Release();
        pStorage-&gt;Release();
        lpDataObject-&gt;Release();
    }
private:
    ULONG m_ulRefCnt;
    BOOL  m_bRelease;

    // The data being bassed to the richedit
    //
    STGMEDIUM m_stgmed;
    FORMATETC m_fromat;

public:
    CImageDataObject() : m_ulRefCnt(0) {
        m_bRelease = FALSE;
    }

    ~CImageDataObject() {
        if (m_bRelease)
            ::ReleaseStgMedium(&amp;m_stgmed);
    }

    // Methods of the IUnknown interface
    //
    STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
    {
        if (iid == IID_IUnknown || iid == IID_IDataObject)
        {
            *ppvObject = this;
            AddRef();
            return S_OK;
        }
        else
            return E_NOINTERFACE;
    }
    STDMETHOD_(ULONG, AddRef)(void)
    {
        m_ulRefCnt++;
        return m_ulRefCnt;
    }
    STDMETHOD_(ULONG, Release)(void)
    {
        if (--m_ulRefCnt == 0)
        {
            delete this;
        }

        return m_ulRefCnt;
    }

    // Methods of the IDataObject Interface
    //
    STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
    {
        HANDLE hDst;
        hDst = ::OleDuplicateData(m_stgmed.hBitmap,
            CF_BITMAP, NULL);
        if (hDst == NULL)
        {
            return E_HANDLE;
        }
       pmedium-&gt;tymed = TYMED_GDI;
        pmedium-&gt;hBitmap = (HBITMAP)hDst;
        pmedium-&gt;pUnkForRelease = NULL;

        return S_OK;
    }
    STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(QueryGetData)(FORMATETC*  pformatetc )
    {
        return E_NOTIMPL;
    }
    STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn, FORMATETC* pformatetcOut)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease)
    {
        m_fromat = *pformatetc;
        m_stgmed = *pmedium;

        return S_OK;
    }
    STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(DUnadvise)(DWORD dwConnection)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise)
    {
        return E_NOTIMPL;
    }

    // Some Other helper functions
    //
    void SetBitmap(HBITMAP *hBitmap)
    {
        STGMEDIUM stgm;
        stgm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle
        stgm.hBitmap = hBitmap;
        stgm.pUnkForRelease = NULL;                // Use ReleaseStgMedium

        FORMATETC fm;
        fm.cfFormat = CF_BITMAP;                // Clipboard format = CF_BITMAP
        fm.ptd = NULL;                            // Target Device = Screen
        fm.dwAspect = DVASPECT_CONTENT;            // Level of detail = Full content
        fm.lindex = -1;                            // Index = Not applicaple
        fm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle

        this-&gt;SetData(&amp;fm, &amp;stgm, TRUE);
    }

    IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage)
    {
        SCODE sc;
        IOleObject *pOleObject;
        sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT,
            &amp;m_fromat, pOleClientSite, pStorage, (void **)&amp;pOleObject);
        return pOleObject;
    }
};
</code></pre>
<p>Wenn ich einfach die HBITMAP durch TGIFImage ersetze bekomme ich bei sc = pOleObject-&gt;GetUserClassID(&amp;clsid); eine Zugriffsverletzung bei adresse 000000</p>
<p>KANN MIR JEMAND HELFEN?<br />
ICH PEIL JETZT NULL MEHR</p>
<p>WinPy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/110614/gif-in-richeditole</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 00:31:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/110614.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 May 2005 22:56:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GIF in RicheditOle on Sun, 22 May 2005 22:56:17 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>also ich habs jetzt endlich hinbekommen ein BMP in mein Richeditole zu bringen!!! Jetzt will ich aber, dass da ein animiertes Gif erscheint!<br />
Ich benutze dazu TGifImage, von der torry seite! Aber bekomme immer Fehler!<br />
Hier mal der alte Code, wie würdet ihr das machen?</p>
<pre><code class="language-cpp">pRichEditOle = NULL;
        ::SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&amp;pRichEditOle);
hBitmap = (HBITMAP) LoadImage(NULL, TEXT(Edit1-&gt;Text.c_str()), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
CImageDataObject::InsertBitmap(pRichEditOle, hBitmap);

und jetzt die Insert bitmap methode!!!!!
class CImageDataObject : IDataObject
{
public:
    // This static function accepts a pointer to IRochEditOle
    //   and the bitmap handle.
    // After that the function insert the image in the current
    //   position of the RichEdit
    //
    static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP *hBitmap)
    {
        SCODE sc;

        // Get the image data object
        //
        CImageDataObject *pods = new CImageDataObject;
        LPDATAOBJECT lpDataObject;
        pods-&gt;QueryInterface(IID_IDataObject, (void **)&amp;lpDataObject);

        pods-&gt;SetBitmap(hBitmap);

        // Get the RichEdit container site
        //
        IOleClientSite *pOleClientSite;
        pRichEditOle-&gt;GetClientSite(&amp;pOleClientSite);

        // Initialize a Storage Object
        //
        IStorage *pStorage;

        LPLOCKBYTES lpLockBytes = NULL;
        sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &amp;lpLockBytes);

        sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
            STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &amp;pStorage);
        if (sc != S_OK)
        {
            lpLockBytes = NULL;
        }

        // The final ole object which will be inserted in the richedit control
        //
        IOleObject *pOleObject;
        pOleObject = pods-&gt;GetOleObject(pOleClientSite, pStorage);

        // all items are &quot;contained&quot; -- this makes our reference to this object
        //  weak -- which is needed for links to embedding silent update.
        OleSetContainedObject(pOleObject, TRUE);

        // Now Add the object to the RichEdit
        //
        REOBJECT reobject;
        ZeroMemory(&amp;reobject, sizeof(REOBJECT));
        reobject.cbStruct = sizeof(REOBJECT);

        CLSID clsid;
        sc = pOleObject-&gt;GetUserClassID(&amp;clsid);

        reobject.clsid = clsid;
        reobject.cp = REO_CP_SELECTION;
        reobject.dvaspect = DVASPECT_CONTENT;
        reobject.poleobj = pOleObject;
        reobject.polesite = pOleClientSite;
        reobject.pstg = pStorage;

        // Insert the bitmap at the current location in the richedit control
        //
        pRichEditOle-&gt;InsertObject(&amp;reobject);

        // Release all unnecessary interfaces
        //
        pOleObject-&gt;Release();
        pOleClientSite-&gt;Release();
        pStorage-&gt;Release();
        lpDataObject-&gt;Release();
    }
private:
    ULONG m_ulRefCnt;
    BOOL  m_bRelease;

    // The data being bassed to the richedit
    //
    STGMEDIUM m_stgmed;
    FORMATETC m_fromat;

public:
    CImageDataObject() : m_ulRefCnt(0) {
        m_bRelease = FALSE;
    }

    ~CImageDataObject() {
        if (m_bRelease)
            ::ReleaseStgMedium(&amp;m_stgmed);
    }

    // Methods of the IUnknown interface
    //
    STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
    {
        if (iid == IID_IUnknown || iid == IID_IDataObject)
        {
            *ppvObject = this;
            AddRef();
            return S_OK;
        }
        else
            return E_NOINTERFACE;
    }
    STDMETHOD_(ULONG, AddRef)(void)
    {
        m_ulRefCnt++;
        return m_ulRefCnt;
    }
    STDMETHOD_(ULONG, Release)(void)
    {
        if (--m_ulRefCnt == 0)
        {
            delete this;
        }

        return m_ulRefCnt;
    }

    // Methods of the IDataObject Interface
    //
    STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
    {
        HANDLE hDst;
        hDst = ::OleDuplicateData(m_stgmed.hBitmap,
            CF_BITMAP, NULL);
        if (hDst == NULL)
        {
            return E_HANDLE;
        }
       pmedium-&gt;tymed = TYMED_GDI;
        pmedium-&gt;hBitmap = (HBITMAP)hDst;
        pmedium-&gt;pUnkForRelease = NULL;

        return S_OK;
    }
    STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(QueryGetData)(FORMATETC*  pformatetc )
    {
        return E_NOTIMPL;
    }
    STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn, FORMATETC* pformatetcOut)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease)
    {
        m_fromat = *pformatetc;
        m_stgmed = *pmedium;

        return S_OK;
    }
    STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(DUnadvise)(DWORD dwConnection)
    {
        return E_NOTIMPL;
    }
    STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise)
    {
        return E_NOTIMPL;
    }

    // Some Other helper functions
    //
    void SetBitmap(HBITMAP *hBitmap)
    {
        STGMEDIUM stgm;
        stgm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle
        stgm.hBitmap = hBitmap;
        stgm.pUnkForRelease = NULL;                // Use ReleaseStgMedium

        FORMATETC fm;
        fm.cfFormat = CF_BITMAP;                // Clipboard format = CF_BITMAP
        fm.ptd = NULL;                            // Target Device = Screen
        fm.dwAspect = DVASPECT_CONTENT;            // Level of detail = Full content
        fm.lindex = -1;                            // Index = Not applicaple
        fm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle

        this-&gt;SetData(&amp;fm, &amp;stgm, TRUE);
    }

    IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage)
    {
        SCODE sc;
        IOleObject *pOleObject;
        sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT,
            &amp;m_fromat, pOleClientSite, pStorage, (void **)&amp;pOleObject);
        return pOleObject;
    }
};
</code></pre>
<p>Wenn ich einfach die HBITMAP durch TGIFImage ersetze bekomme ich bei sc = pOleObject-&gt;GetUserClassID(&amp;clsid); eine Zugriffsverletzung bei adresse 000000</p>
<p>KANN MIR JEMAND HELFEN?<br />
ICH PEIL JETZT NULL MEHR</p>
<p>WinPy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/793872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/793872</guid><dc:creator><![CDATA[WinPy]]></dc:creator><pubDate>Sun, 22 May 2005 22:56:17 GMT</pubDate></item><item><title><![CDATA[Reply to GIF in RicheditOle on Wed, 25 May 2005 20:22:49 GMT]]></title><description><![CDATA[<p>lol? keiner ne ahnung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/796193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/796193</guid><dc:creator><![CDATA[winpy]]></dc:creator><pubDate>Wed, 25 May 2005 20:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to GIF in RicheditOle on Mon, 30 May 2005 15:55:29 GMT]]></title><description><![CDATA[<p>hallo?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799132</guid><dc:creator><![CDATA[winpy]]></dc:creator><pubDate>Mon, 30 May 2005 15:55:29 GMT</pubDate></item><item><title><![CDATA[Reply to GIF in RicheditOle on Mon, 30 May 2005 16:42:44 GMT]]></title><description><![CDATA[<p>1. ich bezweifle dass jemand den ganzen code durchschaut und durchdenkt<br />
2. ich bezweifle dass jemand dir bei deinem fehler helfen kann, wenn du nicht mindestens die fehlermeldung preis gibst</p>
]]></description><link>https://www.c-plusplus.net/forum/post/799168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/799168</guid><dc:creator><![CDATA[BigNeal]]></dc:creator><pubDate>Mon, 30 May 2005 16:42:44 GMT</pubDate></item></channel></rss>