1度目は成功しますが2度目で必ず失敗してしまいます。
2度目にOpenClipboard (Win32API) を実行しようとしたところで(関数が戻ってくる前に)
"OpenClipboardに失敗しました(HRESULTからの例外: 0x800401D0 (CLIPBRD_E_CANT_OPEN))"
となってしまうのですが、どこが悪いのでしょうか???
#include <Windows.h>
bool SetClipboardTextW(const wchar_t *wtext) {
HGLOBAL hMem = NULL;
{
size_t num_wchars = wcslen(wtext) + 1; // 終端文字含む
size_t num_bytes = sizeof(wchar_t) * num_wchars;
hMem = GlobalAlloc(GHND|GMEM_SHARE, num_bytes);
wchar_t *ptr = (wchar_t *)GlobalLock(hMem);
if (ptr) {
wcscpy_s(ptr, num_bytes, wtext);
ptr[num_bytes-1] = L'\0'; // wcscpy_sは終端文字も書き込むはずだが、念のため
GlobalUnlock(hMem);
}
}
if (OpenClipboard(NULL)) { // <--- ここで落ちる
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT, hMem);
CloseClipboard();
return true; // GlobalFreeしてはいけない
} else {
GlobalFree(hMem);
return false;
}
}
int WINAPI WinMain(HINSTANCE hCurrInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
SetClipboardTextW(L"HELLO WORLD");
SetClipboardTextW(L"HELLO WORLD"); // <--- これが成功しない
return 0;
}