Расшифруйте перетаскиваемый элемент Qt в не основанное на Qt приложение
Я пытаюсь реализовать функцию перетаскивания между двумя различными приложениями, приложение A полностью создано мной и использует Qt, в то время как приложение B является сторонним приложением, которое не использует Qt, но я написал код плагина, чтобы я мог используйте классы Qt внутри плагина, если это необходимо.
Получить тип данных не так сложно (где pDataObject является IDataObject*):
std::wstringstream ss;
IEnumFORMATETC* pEnumFmt;
// enumerate the available formats supported by the object
hr = pDataObject->EnumFormatEtc(DATADIR_GET, &pEnumFmt);
FORMATETC fmtlist;
TCHAR szBuf[100];
while (S_OK == pEnumFmt->Next(1, &fmtlist, NULL)) {
GetClipboardFormatName(fmtlist.cfFormat, szBuf, sizeof(szBuf));
ss << szBuf << "\n";
}
И, как и ожидалось, название формата - "application/x-qabstractitemmodeldatalist"
Кажется, все работает хорошо, пока я не хочу получить содержимое этого буфера обмена. Я пытался с помощью
IDataObject* pDataObj;
HRESULT hr = OleGetClipboard(&pDataObj); // access the clipboard
// format characteristics of the data we are after
FORMATETC fmt = { CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgm; // receives the data content
hr = pDataObj->GetData(&fmt, &stgm);
if (hr == S_OK) { // CF_TEXT format available
// we asked for a global memory handle, must lock it for access
LPCTSTR ptxt = (LPCTSTR)GlobalLock(stgm.hGlobal);
for (; ++i < nLength && *ptxt;) // copy as much as will fit
*pszBuf++ = *ptxt++;
*pszBuf = 0; // ensure terminator
GlobalUnlock(stgm.hGlobal);
ReleaseStgMedium(&stgm); // will call GlobalFree
}
pDataObj->Release();
и другие решения, такие как использование оригинального FORMATETC, но все это были слепые шаги, так как я действительно не знаю, как с этим справиться.
В прошлом я реализовал перетаскивание между окнами qt, но теперь, используя IDataObject, это кажется намного сложнее.
Заранее благодарю за любой совет!