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; // <-- automatic conversion from UTF-16 to ANSI
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,the clipboard itself will convert the text for you),例如:
#include <System.SysUtils.hpp> // for ByteLength()
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 类为您处理所有这些细节,例如:
#include <Vcl.Clipbrd.hpp>
Clipboard()->AsText = TMemo1->Text;