ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTML 형태로 클립보드에 올릴 때...
    공장 이야기 2012. 4. 1. 13:50

    BOOL SetClipboardHTML(CComBSTR szHTML)

    {

        UINT uClipBoard = 0;

        char* pszStartHTML = NULL;

        char* pszEndHTML = NULL;

        char* pszInsertTag = NULL;

        int nStartLen = 0;

        int nEndLen = 0;

        int nInsertLen = 0;

        BOOL bResult = FALSE;

        char* pszFinishHTML = NULL;

        int nFinishLen = 0;

        BOOL bClipboard = FALSE;

        HANDLE hHTMLData = NULL;

        char* pszClipboard = NULL;

        TCHAR* pszHTML = 0;

        UINT uHTMLLength = 0;


        if(szHTML.Length() <= 0)

            return FALSE;

     

        uHTMLLength = szHTML.Length();

        pszHTML = (TCHAR *)::malloc((uHTMLLength+1)*sizeof(TCHAR));

        ::memset(pszHTML, 0, (uHTMLLength+1)*sizeof(TCHAR));

        ::memcpy(pszHTML, OLE2T(szHTML.Copy()), uHTMLLength*sizeof(TCHAR));

        uClipBoard = ::RegisterClipboardFormat(_T("HTML Format"));

        nStartLen = (int)strlen("Version:0.9\r\n"

            "StartHTML:00000000\r\n"

            "EndHTML:00000000\r\n"

            "StartFragment:00000000\r\n"

            "EndFragment:00000000\r\n"

            "<html><body>\r\n"

            "<!--StartFragment -->\r\n");

        pszStartHTML = (char *)::malloc(nStartLen+1);

        if(NULL == pszStartHTML)

            return FALSE;

        ::memset(pszStartHTML, 0, nStartLen+1);

        ::memcpy(pszStartHTML, "Version:0.9\r\n"

            "StartHTML:00000000\r\n"

            "EndHTML:00000000\r\n"

            "StartFragment:00000000\r\n"

            "EndFragment:00000000\r\n"

            "<html><body>\r\n"

            "<!--StartFragment -->\r\n", nStartLen);

        nEndLen = (int)strlen("\r\n"

            "<!--EndFragment-->\r\n"

            "</body>\r\n"

            "</html>");

        pszEndHTML = (char *)::malloc(nEndLen+1);

        if(NULL == pszEndHTML)

            goto FREE_MEMORY;

        ::memset(pszEndHTML, 0, nEndLen+1);

        ::memcpy(pszEndHTML, "\r\n"

            "<!--EndFragment-->\r\n"

            "</body>\r\n"

            "</html>", nEndLen);


    #ifdef _UNICODE

        nInsertLen = ::WideCharToMultiByte(CP_UTF8, 0, pszHTML, -1, NULL, 0, NULL, NULL);

        pszInsertTag = (char *)::malloc(nInsertLen);

        if(NULL == pszInsertTag)

            goto FREE_MEMORY;

        ::memset(pszInsertTag, 0, nInsertLen);

        ::WideCharToMultiByte(CP_UTF8, 0, pszHTML, -1, pszInsertTag, nInsertLen, NULL, NULL);

        nInsertLen = nInsertLen - 1;

    #else

        nInsertLen = (int)strlen(pszHTML);

        pszInsertTag = (char *)::malloc(nInsertLen+1);

        if(NULL == pszInsertTag)

            goto FREE_MEMORY;

        ::memset(pszInsertTag, 0, nInsertLen+1);

        ::memcpy(pszInsertTag, pszHTML, nInsertLen);

    #endif


        nFinishLen = nStartLen + nInsertLen + nEndLen;

        pszFinishHTML = (char *)::malloc(nFinishLen+1);

        ::memset(pszFinishHTML, 0, nFinishLen+1);

        ::memcpy(pszFinishHTML, pszStartHTML, nStartLen);

        ::memcpy(pszFinishHTML+nStartLen, pszInsertTag, nInsertLen);

        ::memcpy(pszFinishHTML+nStartLen+nInsertLen, pszEndHTML, nEndLen);


        char *ptr = strstr(pszFinishHTML, "StartHTML");

        wsprintfA(ptr+10, "%08u", strstr(pszFinishHTML, "<html>") - pszFinishHTML);

        *(ptr+10+8) = '\r';


        ptr = strstr(pszFinishHTML, "EndHTML");

        wsprintfA(ptr+8, "%08u", strlen(pszFinishHTML));

        *(ptr+8+8) = '\r';


        ptr = strstr(pszFinishHTML, "StartFragment");

        wsprintfA(ptr+14, "%08u", strstr(pszFinishHTML, "<!--StartFrag") - pszFinishHTML);

        *(ptr+14+8) = '\r';


        ptr = strstr(pszFinishHTML, "EndFragment");

        wsprintfA(ptr+12, "%08u", strstr(pszFinishHTML, "<!--EndFrag") - pszFinishHTML);

        *(ptr+12+8) = '\r';


        bClipboard = OpenClipboard(0);

        if(FALSE == bClipboard)

            goto FREE_MEMORY;

        ::EmptyClipboard();

        hHTMLData = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, strlen(pszFinishHTML)+4);

        if(NULL == hHTMLData)

            goto FREE_MEMORY;

        pszClipboard = (char *)::GlobalLock(hHTMLData);

        if(NULL == pszClipboard)

            goto FREE_MEMORY;

        ::strcpy_s(pszClipboard, strlen(pszFinishHTML)+4, pszFinishHTML);    

        ::GlobalUnlock(hHTMLData);

        ::SetClipboardData(uClipBoard, hHTMLData);

        ::CloseClipboard();

        ::GlobalFree(hHTMLData);


        bResult = TRUE;


    FREE_MEMORY:

        if(NULL != pszHTML)

            ::free(pszHTML);

        pszHTML = NULL;

        if(NULL != pszStartHTML)

            ::free(pszStartHTML);

        pszStartHTML = NULL;

        if(NULL != pszEndHTML)

            ::free(pszEndHTML);

        pszEndHTML = NULL;

        if(NULL != pszInsertTag)

            ::free(pszInsertTag);

        pszInsertTag = NULL;

        if(NULL != hHTMLData)

            ::free(pszFinishHTML);

        pszFinishHTML = NULL;


        return bResult;

    }

Designed by Tistory.