[Win32] SetClipboardData & GlobalFree

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik gebruik de volgende code om een string naar het clipboard kopieeren.
Nu is mijn vraag, moet ik na SetClipboardData nog GlobalFree aanroepen?
MSDN zegt:
After SetClipboardData is called, the system owns the object identified by the hMem parameter. The application can read the data, but must not free the handle or leave it locked until the CloseClipboard function is called. (The application can access the data after calling CloseClipboard). If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.
Als ik het wel doe werkt de functie niet meer, maar als ik het niet doe, lek ik toch een handle?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void CXBTClientDlg::set_clipboard(const string& v)
{
    if (v.empty())
        return;
    void* h = GlobalAlloc(GMEM_MOVEABLE, v.size() + 1);
    void* p = GlobalLock(h);
    if (p)
    {
        memcpy(p, v.c_str(), v.size() + 1);
        GlobalUnlock(h);
        if (OpenClipboard())
        {
            EmptyClipboard();
            SetClipboardData(CF_TEXT, h);
            CloseClipboard();
            return;
        }
    }
    GlobalFree(h);
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-08 16:12
Volgens mij moet de client applicatie die handle weer vrijgeven. Als je de handle in je eigen app free'd knalt de client applicatie volgens mij.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Maar hoe kan ik de data zelf dan nog betrouwbaar benaderen na CloseClipboard?
En als de client app de handle freed, hoe wordt meerdere keren kopieeren dan geimplementeerd?

[ Voor 60% gewijzigd door Olaf van der Spek op 03-10-2004 23:00 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Nee het systeem neemt de handle over en doet deze intern dupliceren voor verschillende processen die hem opvragen. Het systeem doet intern de GlobalFree pas zodra de data van het clipboard af moet, hiermee kan hij er namelijk zorg voor dragen dat de data op het clipboard blijft zelfs als jouw applicatie reeds is afgesloten (key functionality van clipboard tenslotte :) )

Als je de data nog wil benaderen na de CloseClipboard zul je zelf een kopie vantevoren moeten maken, omdat de data simpelweg niet meer van jou is na de SetClipboardData.

[ Voor 21% gewijzigd door curry684 op 03-10-2004 23:07 ]

Professionele website nodig?


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Maar wat bedoelen ze precies met "The application can access the data after calling CloseClipboard" dan?
Daar staat niks over het dupliceren van de handle.

[ Voor 5% gewijzigd door Olaf van der Spek op 03-10-2004 23:12 ]