【发布时间】:2016-11-17 20:58:44
【问题描述】:
我不知道为什么这段代码不能正常工作:
#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)演员不会工作。如果您在代码的其他部分没有向我们展示类似的操作,请停止这样做,因为您的程序注定会失败。 -
SetClipboardData()的返回值是多少?您是否在下面看到我的评论并链接到 API 文档?如果您使用 NULL 窗口句柄,请尝试跳过 EmptyClipboard()。 -
您似乎不太喜欢阅读documentation:“以下值已过时,但提供与 16 位 Windows 兼容。它们是忽略。
GMEM_DDESHARE[...]"。此外,您的代码中的错误检查实际上是零。为什么我们要猜测,哪个 API 调用失败了?GlobalLock应该只在可移动内存上调用(当您请求固定内存时)。它用于将句柄转换为指针,但您已经将有效的内存指针传递给它。不好。
标签: c++ winapi unicode clipboard ollydbg