我不知道为什么这段代码不能正常工作:
#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)
强制转换不起作用。 如果您在代码的其他部分中做类似的事情,则应该停止这样做,因为您的程序注定会失败。 - PaulMcKenzieSetClipboardData()
的返回值是什么?你看到我下面的评论和 API 文档链接了吗?如果使用 NULL 窗口句柄,请尝试跳过EmptyClipboard()
。 - Joseph WillcoxsonGMEM_DDESHARE
[...]”。此外,你的代码中几乎没有错误检查。我们为什么要猜测哪个API调用失败了?GlobalLock
只能在可移动内存上调用(而你请求的是固定内存)。它用于将句柄转换为指针,但你已经传递了一个有效的内存指针。这不好。 - IInspectable