2015-07-01 13 views
5

Ich mache folgende Dinge:Warum verarbeitet ein Qt-Programm Zwischenablagedaten beim Einfügen aus der Zwischenablage in ein externes Programm?

1) Kopieren Sie Daten in die Zwischenablage in meinem Qt-Programm unter Windows.

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

2) Fügen Sie die Daten in ein externes Programm (notepad.exe) ein. Danach beginnt mein Programm die Daten der Zwischenablage zu verarbeiten. Er fordert spezifische Methoden Fenster:

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

Es ist ein Problem, weil, wenn die Größe der Daten in der Zwischenablage groß ist mein Programm auf Speicher in diesen Verfahren der Zuweisung fehlschlägt.

Ich kann es nicht verstehen, weil der Call-Stack ziemlich seltsam ist:

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++ 

Es ist einige Qt interne Arbeit, ich weiß nicht, wie auf sie auswirken.

Antwort

1

Qt könnte die 'interne' Verwendung der Zwischenablage optimieren. So kopiert QApplication::clipboard()->setText(data); nicht wirklich data in Windows-Zwischenablage - Sie könnten es in der gleichen Qt-Anwendung einfügen möchten, so dass Kopieren in Windows-Zwischenablage und wieder nicht erforderlich ist. Nur wenn eine externe Anwendung verwendet wird, findet echtes Kopieren statt.

Qt registriert wahrscheinlich den OLE-Datenprovider als "Zwischenablage-Datenquelle" und Windows verwendet ihn, wenn Daten in der Zwischenablage in der externen App benötigt werden.

So sind die großen Daten in data von Anfang an.

Quellen: Qt Zwischenablage Implementierung für Windows QWindowsClipboard verwendet: OleSetClipboard, die Zeiger auf Datenquelle danken, die Daten nicht selbst

+0

Sie übernimmt! Klingt logisch gut. Ist es deine Hypothese oder es funktioniert wie du beschrieben? Könnten Sie bitte einen Link zu einer Dokumentation freigeben, wenn Sie sie haben? – Deutsche

+0

@Deutsche es war Annahme basierend darauf, wie es vor einiger Zeit funktionierte, sah Code - scheint immer noch angemessen (Links in bearbeitete Antwort) – Hcorg

+0

Großartig! Danke für die Antwort, es erklärt das Problem. Wenn Sie dieses Thema so erfahren haben, wissen Sie vielleicht, wie Sie diese Situation (Bad_alloc in diesem Qt-Code bei der Ereignisverarbeitung) abfangen und die Arbeit der Software korrekt fortsetzen können? – Deutsche

Verwandte Themen