Text
属性返回的是一个 UnicodeString
对象,而不是一个 const char*
指针。同时,也没有从 UnicodeString
到 const char*
的隐式转换(也不需要这样做)。因此,需要手动转换数据,例如使用 WideCharToMultiByte()
(或类似函数),示例如下:
UnicodeString text = TMemo1->Text;
const size_t len = WideCharToMultiByte(CP_ACP, 0, text.c_str(), -1, NULL, 0, NULL, NULL);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem)
{
char *output = (char*) GlobalLock(hMem);
WideCharToMultiByte(CP_ACP, 0, text.c_str(), -1, output, len, NULL, NULL);
GlobalUnlock(hMem);
if (OpenClipboard(0))
{
EmptyClipboard();
if (SetClipboardData(CF_TEXT, hMem))
hMem = NULL;
CloseClipboard();
}
if (hMem)
GlobalFree(hMem);
}
另外,您可以将 TMemo
的文本保存到 AnsiString
中,并让 RTL 为您处理转换,例如:
AnsiString output = TMemo1->Text;
const size_t len = (output.Length() + 1) * sizeof(System::AnsiChar);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem)
{
memcpy(GlobalLock(hMem), output.c_str(), len);
GlobalUnlock(hMem);
if (OpenClipboard(0))
{
EmptyClipboard();
if (SetClipboardData(CF_TEXT, hMem))
hMem = NULL;
CloseClipboard();
}
if (hMem)
GlobalFree(hMem);
}
然而,由于涉及到Unicode文本,您应该使用
CF_UNICODETEXT
格式而不是
CF_TEXT
。这样,您就不需要转换
UnicodeString
数据,只需将其原样存储(如果之后有人从剪贴板请求
CF_TEXT
,
剪贴板本身会为您转换文本),例如:
#include <System.SysUtils.hpp>
UnicodeString output = TMemo1->Text;
const size_t len = ByteLength(output) + sizeof(System::WideChar);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem)
{
memcpy(GlobalLock(hMem), output.c_str(), len);
GlobalUnlock(hMem);
if (OpenClipboard(0))
{
EmptyClipboard();
if (SetClipboardData(CF_UNICODETEXT, hMem))
hMem = NULL;
CloseClipboard();
}
if (hMem)
GlobalFree(hMem);
}
话虽如此,您正在使自己的事情比必要的更加困难。 VCL有一个TClipboard
类来处理这些细节,例如:
Clipboard()->AsText = TMemo1->Text