-
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;
}
'공장 이야기' 카테고리의 다른 글
Webkit bug!!! (0) 2012.10.25 Webkit에서 HTML Tag를 문자열로 입력 받았을 때 IDOMElement 바꾸는 방법 (0) 2012.07.16 Webkit 이상한 오류... (0) 2012.02.10 Webkit 버그... (0) 2012.01.02 Webkit 빌드 시 error PRJ0019 에러를 낼 때... (0) 2011.12.31