Copy HTML to Clipboard

Based on How To Add HTML Code to the Clipboard by Using Visual C++

MSDN:
This is sample code. Add error handling and adjust to your requirements as necessary.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

TEXT TO lcHtml NOSHOW 
<p> <b>Sample HTML</b>
<ol>
<li> <i>Line 1</i>
<li> <s>Line 2</s>
<li> <u>Line 3</u>
</ol>
<hr>
ENDTEXT
 
? CopyHtml2Clipboard(lcHtml)
RETURN
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

* Copy HTML to Clipboard
FUNCTION CopyHtml2Clipboard(tcHtmlText)
LOCAL lnDataLen, lcDropFiles, llOk, i, lhMem, lnPtr, lcHtmlText, lnRtfFormat, lcHtmlFormatHeader, lcHtmlEnd
LOCAL lcHtmlStart, lcCrLf
 
*  Global Memory Variables with Compile Time Constants
#DEFINE GMEM_MOVABLE 	0x0002
#DEFINE GMEM_ZEROINIT	0x0040
#DEFINE GMEM_SHARE	0x2000
 
* Load required Windows API functions
=LoadApiDlls()
 
llOk = .T.
* Clipboard HTML Format header
TEXT TO lcHtmlFormatHeader NOSHOW 
Format:HTML Format
Version:0.9
StartHTML:00000000
EndHTML:00000000
StartFragment:00000000
EndFragment:00000000

ENDTEXT

lcCrLf = CHR(13) + CHR(10)

* Check if Full HTML or fragmen is passed
llFullHtml = (ATC("<html>", tcHtmlText) <> 0)
IF NOT llFullHtml 
	lcHtmlStart = "<html><body>" + lcCrLf + "<!-- ---StartFragment--- -->" + lcCrLf
	lcHtmlEnd = lcCrLf + "<!-- ---EndFragment--- -->" + lcCrLf + "<\body><\html>"
ELSE	
	lcHtmlStart = ""
	lcHtmlEnd = ""
ENDIF

lcHtmlText = lcHtmlFormatHeader + lcHtmlStart + tcHtmlText + lcHtmlEnd + CHR(0)
* Fill header
lnPos = AT("<html>", lcHtmlText) - 1
lcHtmlText = STRTRAN(lcHtmlText, "StartHTML:00000000", "StartHTML:" + PADL(lnPos,8, "0"))
lnPos = AT("<!-- ---StartFragment--- -->", lcHtmlText)-1
lcHtmlText = STRTRAN(lcHtmlText, "StartFragment:00000000", "StartFragment:" + PADL(lnPos,8, "0"))
lnPos = LEN(lcHtmlText)
lcHtmlText = STRTRAN(lcHtmlText, "EndHTML:00000000", "EndHTML:" + PADL(lnPos,8, "0"))
lnPos = AT("<!-- ---EndFragment--- -->", lcHtmlText)-1
lcHtmlText = STRTRAN(lcHtmlText, "EndFragment:00000000", "EndFragment:" + PADL(lnPos,8, "0"))

lnDataLen = LEN(lcHtmlText)
* Copy text into the allocated memory
lhMem = GlobalAlloc(GMEM_MOVABLE+GMEM_ZEROINIT+GMEM_SHARE, lnDataLen+4)
lnPtr = GlobalLock(lhMem)
=CopyFromStr(lnPtr, @lcHtmlText, lnDataLen)
=GlobalUnlock(lhMem)
* Open clipboard and store HTML text into it
llOk = (OpenClipboard(0) <> 0)
IF llOk
	=EmptyClipboard()
	lnHtmlFormat = RegisterClipboardFormat("HTML Format")
	llOk = (SetClipboardData(lnHtmlFormat, lhMem) <> 0)
	* If call to SetClipboardData() is successful, the system will take ownership of the memory
	*   otherwise we have to free it
	IF NOT llOk
		=GlobalFree(lhMem)
	ENDIF
	* Close clipboard
	=CloseClipboard()
ENDIF

RETURN llOk

FUNCTION LoadApiDlls
*  Clipboard Functions
DECLARE LONG OpenClipboard IN WIN32API LONG HWND
DECLARE LONG CloseClipboard IN WIN32API
DECLARE LONG EmptyClipboard IN WIN32API
DECLARE LONG SetClipboardData IN WIN32API LONG uFormat, LONG hMem
DECLARE LONG RegisterClipboardFormat IN WIN32API STRING lpszFormat
 
*  Memory Management Functions
DECLARE LONG GlobalAlloc IN WIN32API LONG wFlags, LONG dwBytes
DECLARE LONG GlobalFree IN WIN32API LONG HMEM
DECLARE LONG GlobalLock IN WIN32API LONG HMEM
DECLARE LONG GlobalUnlock IN WIN32API LONG HMEM
DECLARE LONG RtlMoveMemory IN WIN32API As CopyFromStr LONG lpDest, String @lpSrc, LONG iLen
RETURN

Comments