Копирование строки Unicode в буфер обмена не работает

Я не знаю, почему этот код не работает должным образом:

#define UNICODE

#include <iostream>
#include <sstream>
#include <windows.h>

void main(void)
{
wchar_t* strData = L"CreateWindowExA";

MessageBox(NULL, strData, L"Warning", MB_OK);

if (OpenClipboard(0)) {
EmptyClipboard();
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE,
wcslen(strData) + 1);
char* pchData;
pchData = (char*)GlobalLock(hClipboardData);
strcpy(pchData, LPCSTR(strData));
GlobalUnlock(hClipboardData);
SetClipboardData(CF_TEXT, hClipboardData);
CloseClipboard();
}

MessageBox(NULL, L"Copied to Clipboard", L"Title", MB_OK);
}

-1

Решение

Изменить этот раздел:

hClipboardData = GlobalAlloc(GMEM_DDESHARE, 2 * (wcslen(strData) + 1));

WCHAR* pchData;
pchData = (WCHAR*)GlobalLock(hClipboardData);
wcscpy(pchData, strData);
GlobalUnlock(hClipboardData);
SetClipboardData(CF_UNICODETEXT, hClipboardData);

Выделите 2 * количество байтов для WCHAR. Вместо чар, WCHAR. Вместо strcpy, wcscpy. Вместо CF_TEXT, CF_UNICODETEXT.

4

Другие решения

Вам нужно применить следующие изменения, чтобы исправить свой код:

if (OpenClipboard(0)) {

Вам необходимо предоставить действительный дескриптор окна, чтобы стать владельцем буфера обмена. Требуется владение, чтобы вы могли изменить содержимое буфера обмена.

    HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE,
wcslen(strData) + 1);

Есть 2 ошибки, которые необходимо исправить. Как объяснено в разделе Память и буфер обмена, при помещении объекта в буфер обмена память должна выделяться с помощью GlobalAlloc функция с GMEM_MOVEABLE флаг. GMEM_DDESHARE, с другой стороны, игнорируется, и без каких-либо флагов вызов по умолчанию использует GMEM_FIXED. Это вернет указатель памяти и передаст его GlobalLock впоследствии потерпит неудачу.

Во-вторых, этот вызов API требует размера в байтов. Единица кода Unicode в Windows составляет 2 байта. Тебе нужно (wcslen(strData) + 1) * sizeof(wchar_t),

    char* pchData;
pchData = (char*)GlobalLock(hClipboardData);
strcpy(pchData, LPCSTR(strData));

strcpy копирует однобайтовые единицы, вплоть до первого символа NUL. С кодировкой UTF-16LE (используемой в Windows) вы копируете один символ. Вы должны использовать wcscpy вместо этого и приведите пункт назначения к wchar_t*:

    wchar_t* pchData;
pchData = (wchar_t*)GlobalLock(hClipboardData);
wcscpy(pchData, strData);

    SetClipboardData(CF_TEXT, hClipboardData);

Поскольку вы скопировали текст в кодировке UTF-16LE, формат буфера обмена должен быть CF_UNICODETEXT,


Рекомендации:

3

strcpy(pchData, LPCSTR(strData));

не очень хороший выбор для данных UTF16.

использование wcscpy и удалите актерский состав.

1
По вопросам рекламы [email protected]