--- E:/Work/s-keeper/5.1/extsdk/qt/5.4.0/qclipboard_win-2519.cpp Ср июл 17 09:40:08 2013 +++ E:/Work/s-keeper/5.1/extsdk/qt/5.4.0/qclipboard_win-2550.cpp Пт авг 2 11:15:40 2013 @@ -267,7 +267,59 @@ void QClipboard::setMimeData(QMimeData *src, Mode d->iData = new QOleDataObject(src); } - if (OleSetClipboard(d->iData) != S_OK) { + if (OleSetClipboard(d->iData) != S_OK) + { + +////////////////////////////////////////////////////////////////////////// +/// Заплатка от ISS Inc. +////////////////////////////////////////////////////////////////////////// +// +// Суть заплатки в том, что OLE методы не работают если COM был +// инициализирован с многопоточным флагом и методов обхода найдено +// не было, поэтому реализовано копирование в буфер обмена через +// обычные WinAPI средста (правда сделана работа только с текстом). +// +////////////////////////////////////////////////////////////////////////// + if (src->hasText()) + { + QWidget* window = QApplication::activeWindow(); + const bool wasOpened = !window ? false : OpenClipboard(window->winId()); + if (wasOpened) + { + const QString text = src->text(); + const int length = text.length(); + const int size = (length + 1) * sizeof(wchar_t); + + HGLOBAL bufferHandle = ::GlobalAlloc(GMEM_MOVEABLE, size); + { + wchar_t* buffer = (wchar_t*)::GlobalLock(bufferHandle); + text.toWCharArray(buffer); + buffer[length] = L'\0'; + GlobalUnlock(bufferHandle); + } + + EmptyClipboard(); + + HANDLE hr = SetClipboardData(CF_UNICODETEXT, bufferHandle); + if (hr != bufferHandle) + { + qErrnoWarning("QClipboard::setMimeData: Failed to set data on clipboard"); + } + + CloseClipboard(); + } + else + { + qErrnoWarning("QClipboard::setMimeData: Failed to open clipboard"); + } + + d->releaseIData(); + return; + } +////////////////////////////////////////////////////////////////////////// +/// Конец заплатки +////////////////////////////////////////////////////////////////////////// + d->releaseIData(); qErrnoWarning("QClipboard::setMimeData: Failed to set data on clipboard"); return;