2015-07-01 15 views
5

Wykonuję następujące czynności:Dlaczego program Qt przetwarza dane ze schowka po wklejeniu ze schowka do zewnętrznego programu?

1) Skopiuj dane do schowka w moim programie Qt w systemie Windows.

QApplication::clipboard()->setText(data); 

2) Wklej dane do zewnętrznego programu (notepad.exe). Po tym czasie mój program rozpoczyna przetwarzanie danych schowka. nazywa to specyficzne metody Windows:

QWindowsOleDataObject::GetData(...); 
... QWindowsMimeText::convertFromMime(...); 

to jest problem, bo gdy rozmiar danych w schowku jest duża mój program nie działa na pamięci przydziale w tych metod.

Nie mogę zrozumieć, bo stos wywołań jest dość dziwne:

qwindowsd.dll!QWindowsMimeText::convertFromMime(const tagFORMATETC & formatetc, const QMimeData * mimeData, tagSTGMEDIUM * pmedium) Line 606 C++ 
qwindowsd.dll!QWindowsOleDataObject::GetData(tagFORMATETC * pformatetc, tagSTGMEDIUM * pmedium) Line 144 C++ 
[External Code] 
Qt5Cored.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 740 C++ 
qwindowsd.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 73 C++ 
Qt5Cored.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 129 C++ 
Qt5Cored.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 204 C++ 
Qt5Cored.dll!QCoreApplication::exec() Line 1188 C++ 
Qt5Guid.dll!QGuiApplication::exec() Line 1508 C++ 
Qt5Widgetsd.dll!QApplication::exec() Line 2957 C++ 
main(int argc, char * * argv) Line 759 C++ 

Jest jakiś Qt praca wewnętrzna, nie wiem, jak na niego wpływ.

Odpowiedz

1

Qt może zoptymalizować "wewnętrzne" użycie schowka. Tak więc QApplication::clipboard()->setText(data); tak naprawdę nie kopiuje do schowka Windows data - możesz go wkleić wewnątrz tej samej aplikacji Qt, więc kopiowanie do schowka Windows i znowu nie jest konieczne. Tylko wtedy, gdy używana jest aplikacja zewnętrzna, zachodzi prawdziwe kopiowanie.

Qt prawdopodobnie rejestruje dostawcę danych OLE jako "źródło danych schowka", a system Windows używa go, gdy dane schowka są potrzebne w zewnętrznej aplikacji.

Więc duże dane są od data.

Źródła: realizacja Qt Schowek dla Windows QWindowsClipboard zastosowań: OleSetClipboard, która przyjmuje wskaźnik do źródła danych, sama nie dane

+0

Dziękujemy! Brzmi logicznie dobrze. Czy to twoja hipoteza, czy działa tak, jak opisałeś? Czy mógłbyś udostępnić link do jakiejś dokumentacji, jeśli masz go? – Deutsche

+0

@Deutsche było założenie oparte na tym, jak to działało jakiś czas temu, patrząc na kod - wydaje się nadal odpowiednie (linki w edytowanej odpowiedzi) – Hcorg

+0

Świetnie! Dziękuję za odpowiedź, wyjaśnia problem. Jeśli jesteś tak doświadczony w tym temacie, może wiesz, jak złapać tę sytuację (bad_alloc w tym kodzie Qt na przetwarzanie zdarzeń) i kontynuować pracę oprogramowania poprawnie? – Deutsche

Powiązane problemy