2010-01-29 6 views
6

In Win32 zum Einfügen von Daten in die Zwischenablage muss ich GlobalAlloc() anrufen, dann GlobalLock(), um einen Zeiger zu erhalten, kopieren Sie dann Daten, dann rufen Sie GlobalUnlock() und SetClipboardData().Was passiert, wenn ich GlobalLock() aufrufen und dann GlobalUnlock() nicht aufrufen kann?

Wenn der Code in C++ eine Ausnahme könnte zwischen den Aufrufen GlobalLock() und GlobalUnlock() geworfen werden, und wenn ich diesen GlobalUnlock() nicht kümmern wird nicht aufgerufen werden.

Ist das ein Problem? Was genau passiert, wenn ich GlobalLock() anrufen und aus welchen Gründen auch immer eine Paarung GlobalUnlock() Anruf überspringen?

Antwort

9

Die Frage ist nicht nur, ob oder wenn Sie nicht anrufen GlobalUnlock(). Sie müssen GlobalUnlock() und GlobalFree() anrufen. Beide müssen aufgerufen werden, um den zugewiesenen Speicher freigeben zu können:

Das Leck würde Anwendung breit sein. Wenn Sie eine Windows-Anwendung beenden, wird der gesamte zugewiesene private Speicher automatisch freigegeben

+1

Nein, GlobalFree() sollte nicht aufgerufen werden, wenn die Daten in die Zwischenablage eingefügt werden - Besitz wird an den Clipborad übergeben und Speicher später freizugeben. – sharptooth

+1

Ja, Sie haben Recht, wenn der Aufruf von SetClipboardData erfolgreich durchgeführt wurde. Aber ansonsten müssen Sie beide anrufen. Post entsprechend modifiziert. –

9

Mehr als Sie jemals (wirklich) über GlobalLock(), mit freundlicher Genehmigung von Raymond Chen wissen wollte:

Ich markiere dieses Community-Wiki, weil ich eigentlich nicht weiß, ob diese Artikel deine Frage beantworten. Aber sie sind es wahrscheinlich wert, durchzuwaten, zumindest für einen Skim.

Aber eine Möglichkeit, Ihr Problem mit dem Umgang mit dem GlobalUnlock() angesichts von Ausnahmen zu behandeln, ist die Verwendung einer RAII-Klasse, um die GlobalLock()/GlobalUnlock() Anrufe zu verwalten.

Verwandte Themen