я не знаю, почему этот код не работает должным образом:Копировать юникод строку в буфер обмена не работает
#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);
}
Аргумент, определяющий сумму, выделяемую в 'GlobalAlloc', выделяет количество ** байтов **, а не количество символов (которые в вашем случае имеют ширину 2 байта). Вам нужно выяснить, сколько байтов выделить. Во-вторых, вы не конвертируете широкие строки в строки ANSI и наоборот, просто литье. Это '(LPCSTR)' cast не будет работать.Если вы делаете что-то подобное в некоторых других частях вашего кода, вы не показываете нам, то прекратите делать это, так как ваша программа будет обречена на провал. – PaulMcKenzie
Что такое возвращаемое значение из 'SetClipboardData()'? Вы видите мой комментарий ниже и ссылку на документацию API? Попробуйте пропустить EmptyClipboard(), если вы используете дескриптор окна NULL. –
Вы не являетесь большим поклонником чтения [документации] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366574.aspx): * «Следующие значения устарели, но предоставляются для совместимости с 16-разрядными Windows. ** Они игнорируются. ** 'GMEM_DDESHARE' [...]" *. Кроме того, в вашем коде буквально проверяется ошибка. Почему мы должны угадать, какой API-вызов терпит неудачу? 'GlobalLock' следует вызывать только в подвижной памяти (при запросе фиксированной памяти). Он используется для преобразования дескриптора в указатель, но вы уже передаете ему действительный указатель памяти. Нехорошо. – IInspectable