请教用内存编码再通过内存地址传送,有具体的可执行代码吗?以下是搜到的,但调试不成功。
以下代码执行下来无效果。
* 读取剪贴板Unicode文本(修复内存复制问题)
LOCAL hClip, pData, nSize, cBuffer, cUnicode
cUnicode = ""
DECLARE INTEGER OpenClipboard IN user32 INTEGER hWnd
DECLARE INTEGER CloseClipboard IN user32
DECLARE INTEGER GetClipboardData IN user32 INTEGER uFormat
DECLARE INTEGER GlobalLock IN kernel32 INTEGER hMem
DECLARE INTEGER GlobalUnlock IN kernel32 INTEGER hMem
DECLARE INTEGER GlobalSize IN kernel32 INTEGER hMem
DECLARE INTEGER RtlMoveMemory IN kernel32;
STRING @lpvDest, INTEGER lpvSource, INTEGER cbCopy
IF OpenClipboard(0) = 0
MESSAGEBOX("剪贴板被占用,请关闭占用程序后重试", 16)
RETURN ""
ENDIF
* 读取CF_UNICODETEXT格式(13)
hClip = GetClipboardData(13)
IF hClip > 0
pData = GlobalLock(hClip)
IF pData > 0
nSize = GlobalSize(hClip)
IF nSize > 0 AND nSize % 2 = 0
&& 确保UTF-16格式(偶数字节)
cBuffer = REPLICATE(CHR(0), nSize)
RtlMoveMemory(@cBuffer, pData, nSize)
&& 稳定复制内存
cUnicode = STRTRAN(cBuffer, CHR(0)+CHR(0), "", 1, 1)
&& 移除结尾空字符
ENDIF
GlobalUnlock(hClip)
ENDIF
ENDIF
CloseClipboard()
&&RETURN cUnicode
&&cUnicode
* 将UTF-16字符串转为UTF-8(用于文件输出)
LOCAL nLen, nBufSize, cUTF8, nResult
nLen = LEN(cUnicode)
IF nLen = 0
RETURN ""
ENDIF
DECLARE INTEGER WideCharToMultiByte IN kernel32;
INTEGER CodePage, INTEGER dwFlags,;
STRING cWideCharStr, INTEGER cchWideChar,;
STRING @cMultiByteStr, INTEGER cchMultiByte,;
STRING cDefaultChar, INTEGER @lpUsedDefaultChar
* 获取所需缓冲区大小
nBufSize = WideCharToMultiByte(65001, 0, cUnicode, nLen/2, "", 0, "", 0)
IF nBufSize = 0
RETURN ""
ENDIF
* 转换为UTF-8
cUTF8 = REPLICATE(CHR(0), nBufSize)
nResult = WideCharToMultiByte(65001, 0, cUnicode, nLen/2, @cUTF8, nBufSize, "", 0)
thisform.olecontrol4.font.Name = "微软雅黑"
thisform.olecontrol1.text=nResult
thisform.olecontrol2.text=nLen
thisform.olecontrol3.text=nBufSize
thisform.olecontrol4.text=FILETOSTR("test.txt") &&cUTF8
以下是引用吹水佬在2025-8-18 22:43:38的发言:
不要用vfp字符串来处理输入输出。
可以用内存编码再通过内存地址传送。
或者用转义字符码,如用web控件时html的....,ŋ的码是014b(两字节)。