2010-02-15 116 views
2

我是基本的一些代码关闭此code,也在我的其他question中提到。该版本强制字符类型为char*,这会破坏我的unicode项目的编译。所以,我做了如下调整:复制字符串到剪贴板,只有一个字符粘贴时写

void SetClipboardText(CString & szData) 
{ 
    HGLOBAL h; 
    LPTSTR arr; 

    size_t bytes = (szData.GetLength()+1)*sizeof(TCHAR); 
    h=GlobalAlloc(GMEM_MOVEABLE, bytes); 
    arr=(LPTSTR)GlobalLock(h); 
    ZeroMemory(arr,bytes); 
    _tcscpy_s(arr, szData.GetLength()+1, szData); 
    szData.ReleaseBuffer(); 
    GlobalUnlock(h); 

    ::OpenClipboard (NULL); 
    EmptyClipboard(); 
    SetClipboardData(CF_TEXT, h); 
    CloseClipboard(); 
} 

的复制看起来很好 - 在调试器Visual Studio中运行的告诉我arr包含复制串预期。 但是当我粘贴到任何应用程序时,只粘贴第一个字符。

怎么回事?

回答

5

您在上一个问题的评论中的Unicode评论是有说服力的。如果您的字符串宽度较低且字符串较低,那么在UTF-16中,它将被编码为低位ASCII字节,然后是NULL。 Use CF_UNICODETEXT instead of CF_TEXT

+0

好的,我从来没有想过那个2nd-byte-is-zero的情况。 – 2010-02-15 11:36:50

相关问题