


So verstehen Sie die Zwischenablage der C++-MFC-Interprozesskommunikation
Der Inhalt dieses Artikels befasst sich mit dem Verständnis der Zwischenablage der C++-MFC-Kommunikation. Ich hoffe, dass er für Sie hilfreich ist.
Die Windows-Zwischenablage ist ein relativ einfacher Kommunikationsmechanismus zwischen Prozessen und ihr Overhead ist relativ gering. Das Implementierungsprinzip ist eigentlich ein vom Betriebssystem verwalteter Speicherbereich. Dieser Speicherbereich gehört zu keinem separaten Prozess, aber jeder Prozess kann auf diesen Speicherbereich zugreifen im Speicherbereich, und ein anderer Prozess kann die Daten aus dem Speicherbereich abrufen, um eine Kommunikation zu erreichen. Der Implementierungsprozess besteht aus zwei Teilen, einem ist der gemeinsam genutzte Speichervorgang und der andere ist der Zwischenablagevorgang.
1. Zwischenablage-Operation
(1) HWND GetClipboardOwner();
Funktion: Ruft das Handle ab, das auf den aktuellen Besitzer der Zwischenablage zeigt
Wenn diese Funktion erfolgreich ausgeführt wird, gibt sie das Fenster zurück, das der Besitzer ist Der Griff der Zwischenablage. Andernfalls wird NULL zurückgegeben.
Der erste Parameter hWndNewOwner zeigt auf ein damit verbundenes Fensterhandle, was bedeutet, dass dieses Fenster die Zwischenablage öffnet Öffnen Sie die Zwischenablage mit der aktuellen Aufgabe oder dem aktuellen Prozess. Wenn die Zwischenablage erfolgreich geöffnet wurde, gibt diese Funktion einen Wert ungleich Null zurück. Wenn ein anderes Programm die Zwischenablage bereits geöffnet hat, kann das aktuelle Programm die Zwischenablage nicht öffnen, und die Funktion gibt einen Wert von 0 zurück. Tatsächlich ist dies leicht zu verstehen. Die Zwischenablage verfügt nur über einen solchen Speicherbereich, und Ihr Prozess B möchte Daten hineinschreiben Der Weg, dieses Durcheinander zu lösen, ist: Wenn Prozess A Daten in die Zwischenablage schreibt (was so verstanden werden kann, dass Prozess A die Zwischenablage öffnet), kann Prozess B keine Daten in die Zwischenablage schreiben Zwischenablage. Dann lasse ich zu, dass Prozess B die Zwischenablage nicht öffnet. Wenn also ein Programm die Zwischenablage geöffnet hat, können andere Anwendungen die Zwischenablage erst dann ändern, wenn das Programm, das die Zwischenablage geöffnet hat, die Funktion „CloseClipboard“ aufruft.
Und erst nach dem Aufruf der Funktion „EmptyClipboard“ wird die Zwischenablage geöffnet. Das aktuelle Fenster kann eine Zwischenablage haben
Wenn ein Prozess die Zwischenablage öffnet, bevor der Prozess die CloseClipboard-Funktion aufruft, um das Zwischenablage-Handle zu schließen, können andere Prozesse die Zwischenablage nicht öffnen Zwischenablage, daher sollten wir die Zwischenablage jedes Mal schließen, wenn wir sie verwenden. Beachten Sie, dass das Schließen der Zwischenablage hier nicht bedeutet, dass das Programm, das die Zwischenablage gerade öffnet, den Besitz der Zwischenablage verliert. Erst nachdem ein anderes Programm die EmptyClipboard-Funktion aufruft, verliert das aktuelle Programm den Besitz der Zwischenablage Zwischenablage.
SetClipboardData-Funktion wird verwendet, um Daten in der Zwischenablage abzulegen. Der erste Parameter uFormat wird verwendet, um das Format der Daten anzugeben, die in der Zwischenablage abgelegt werden sollen, z. B. CF_BITMAP, CF_TEXT, CF_DIB usw. (andere Formate finden Sie in MSDN). Der zweite Parameter hMem wird verwendet, um das Handle von Daten mit dem angegebenen Format anzugeben. Dieser Parameter kann NULL sein. Wenn der Parameter NULL ist, bedeutet dies, dass das Programm (d Zwischenablage Der Besitzprozess kopiert die Daten in die Zwischenablage, dh stellt die Daten im angegebenen Zwischenablageformat bereit. Die oben erwähnte Technologie zur verzögerten Übermittlung wird später im Detail vorgestellt.
(6) HANDLE GetClipboardData( UINT uFormat );
2. Gemeinsam genutzte Speicherzuweisung
Der erste Parameter uFlags wird verwendet, um die Art der Speicherzuweisung anzugeben. Sein Wert wird in der folgenden Liste angezeigt. Aufgrund der Notwendigkeit, einen dynamischen Datenaustausch zu erreichen, muss jedoch GHND oder GMEM_MOVEABLE verwendet werden):
GHND Eine Kombination aus GMEM_MOVEABLE und GMEM_ZEROINIT.
GMEM_FIXED reserviert einen festen Speicher und der Rückgabewert ist ein Zeiger.
GMEM_MOVEABLE Weist einen Teil des Wechselspeichers zu.
GMEM_ZEROINIT initialisiert den Speicherinhalt auf 0
GPTR ist die Kombination aus GMEM_FIXED und GMEM_ZEROINIT.
Der zweite Parameter dwBytes wird verwendet, um die Anzahl der zugewiesenen Bytes anzugeben.
(2) HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);
Diese Funktion ist eine Neuzuweisungsfunktion, das heißt, um den Speicherplatz auf dem ursprünglichen Datenobjekt hMem zu erweitern.
Der erste Parameter hMem stellt das von der GlobalAlloc-Funktion zurückgegebene Datenobjekthandle dar.
Der zweite Parameter dwBytes gibt die Größe des Speichers an, der neu zugewiesen werden muss.
Der dritte Parameter uFlags gibt die Zuweisungsmethode an (siehe Funktion GlobalAlloc).
(3) SIZE_T WINAPI GlobalSize( HGLOBAL hMem );
Diese Funktion wird verwendet, um die Größe des Speicherblocks zurückzugeben.
Der erste Parameter hMem stellt das von der GlobalAlloc-Funktion zurückgegebene Datenobjekthandle dar.
(4) LPVOID WINAPI GlobalLock( HGLOBAL hMem ); Die Funktion dieser Funktion besteht darin, das globale Speicherobjekt zu sperren und dann den Zeiger auf das erste Byte des Speicherblocks des Objekts zurückzugeben.
Der erste Parameter hMem stellt das von der GlobalAlloc-Funktion zurückgegebene Datenobjekthandle dar.
Sie können über die obige GlobalLock-Funktion Zugriff erhalten.
Sperren bedeutet, dass Sie diesen Teil des Speichers bereits verwenden Speicher, andere Programme können diesen globalen Speicher nicht mehr nutzen, und wenn Sie ihn nie entsperren, ist das kein Problem, andere Programme werden diesen globalen Speicher nie nutzen können, er heißt immer noch globaler Speicher. Was machen Sie? Diese Funktion wird also verwendet, um das globale Speicherobjekt zu entsperren.
Der erste Parameter hMem stellt das von der GlobalAlloc-Funktion zurückgegebene Datenobjekthandle dar.
Diese Funktion gibt den globalen Speicherblock frei.
Der erste Parameter hMem stellt das von der GlobalAlloc-Funktion zurückgegebene Datenobjekthandle dar.
// Ctrl+C.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream> #include <process.h> #include <windows.h> using namespace std;int main() { HWND hWnd = GetClipboardOwner();//获取当前剪贴板所属的窗口句柄 DWORD Len = 32; HGLOBAL pClipData; pClipData = GlobalAlloc(GHND,Len+1);//分配共享内存 char* pData; pData = (char*)GlobalLock(pClipData);//内存控制句柄加锁,其他进程不能再访问 for(int i = 0;i < Len;i++) { pData[i] = 'a'+i; //在全局内存中赋值 } GlobalUnlock(pClipData);//内存控制句柄解锁,其他进程可以访问 if(!OpenClipboard(hWnd))//打开剪贴板 { cout<<"OPen fail!"<<endl; return 0; } EmptyClipboard();//清空剪贴板,这一步才真正拥有剪贴板 SetClipboardData(CF_TEXT,pClipData);//将共享内存里的数据放入剪贴板 CloseClipboard();//关闭剪贴板 cout<<"剪贴完成"<<endl; return 0; }
Das obige ist der detaillierte Inhalt vonSo verstehen Sie die Zwischenablage der C++-MFC-Interprozesskommunikation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
