none
클립보드 사용 중 GlobalMemory관련하여 질문이 있습니다.

    질문

  • 안녕하세요. 클립보드 사용 중 GlobalMemory관련하여 질문이 있습니다.

    아래 코드를 보시면 1번과 2번 위치가 이상해서 그런데요, MSDN을 참조했을때는 COleDataObject::GetGlobalData에서 분명 Global memory block을 할당하고 여기에 내용을 채워서 준다고 되어있는데, 그렇다면 이때 사용한 Global Memory를 Free해줘야 되는거 아닌가요? 다른 예제들이나 인터넷을 찾아봤을때는 대부분 GlobalFree를 해주지 않던데 하지 않아도 되는건가요?

    감사합니다.


    doPaste(const ClipboardFormats clipboardFormat, COleDataObject& obj)

    {

         if( obj.IsDataAvailable(clipboardFormat) )

         {

            HGLOBAL hmem = obj.GetGlobalData(clipboardFormat);

    if( NULL != hmem ) 
    {
    BYTE* memBlock = (BYTE*)::GlobalLock(hmem);
    if( nullptr == memBlock)
    {
    ::GlobalFree(hmem); --------------------------------------------------------------------------1
    return clipboardDB;
    }

    unsigned int size = (unsigned int)(::GlobalSize(hmem));

    if(size > 0)
    {
    CMemFile sf(memBlock, size);
    // do to
    }

    ::GlobalUnlock(hmem);
    ::GlobalFree(hmem);------------------------------------------------------------------------ 2
    }

         } 

    }


    2018년 5월 16일 수요일 오전 1:49

답변

  • HGLOBAL 이 null 이 아니면 GlobalFree()를 호출하는 것이 맞지 않을 까 합니다. 아래와 같은 링크가 있으므로 참조해보세요.

    http://www.sinis.ro/static/ch19c.htm

    here's how the text string placed on the OLE clipboard in the previous example is retrieved using COleDataObject:

    char szText[BUFLEN];
    COleDataObject odo;
    odo.AttachClipboard ();
    HANDLE hData = odo.GetGlobalData (CF_TEXT);
    
    if (hData != NULL) {
        LPCSTR pData = (LPCSTR) ::GlobalLock (hData);
        if (::lstrlen (pData) < BUFLEN)
            ::lstrcpy (szText, pData);
        ::GlobalUnlock (hData);
        ::GlobalFree (hData);
    }
    

    The AttachClipboard function creates a logical connection between a COleDataObject and the OLE clipboard. Once the connection is made, MFC transforms calls to GetGlobalData and other COleDataObject data retrieval functions into GetData calls through the IDataObject pointer returned by ::OleGetClipboard. Don't forget that it's your responsibility to free the global memory block returned by GetGlobalData. That requirement explains the call to ::GlobalFree in the preceding example.

    • 답변으로 표시됨 tj.ahn 2018년 5월 18일 금요일 오전 5:25
    2018년 5월 17일 목요일 오전 2:02

모든 응답

  • HGLOBAL 이 null 이 아니면 GlobalFree()를 호출하는 것이 맞지 않을 까 합니다. 아래와 같은 링크가 있으므로 참조해보세요.

    http://www.sinis.ro/static/ch19c.htm

    here's how the text string placed on the OLE clipboard in the previous example is retrieved using COleDataObject:

    char szText[BUFLEN];
    COleDataObject odo;
    odo.AttachClipboard ();
    HANDLE hData = odo.GetGlobalData (CF_TEXT);
    
    if (hData != NULL) {
        LPCSTR pData = (LPCSTR) ::GlobalLock (hData);
        if (::lstrlen (pData) < BUFLEN)
            ::lstrcpy (szText, pData);
        ::GlobalUnlock (hData);
        ::GlobalFree (hData);
    }
    

    The AttachClipboard function creates a logical connection between a COleDataObject and the OLE clipboard. Once the connection is made, MFC transforms calls to GetGlobalData and other COleDataObject data retrieval functions into GetData calls through the IDataObject pointer returned by ::OleGetClipboard. Don't forget that it's your responsibility to free the global memory block returned by GetGlobalData. That requirement explains the call to ::GlobalFree in the preceding example.

    • 답변으로 표시됨 tj.ahn 2018년 5월 18일 금요일 오전 5:25
    2018년 5월 17일 목요일 오전 2:02
  • 감사합니다. 제가 테스트해본 결과로도, COleDataObject::GetGlobalData를 계속해서 호출하고 GlobalFree를 하지 않으니 어느시점부터 HGLOBAL이 NULL로 나오네요.

    감사합니다.

    2018년 5월 18일 금요일 오전 5:24