Heim Java javaLernprogramm So verstehen Sie die Zwischenablage der C++-MFC-Interprozesskommunikation

So verstehen Sie die Zwischenablage der C++-MFC-Interprozesskommunikation

Sep 15, 2018 am 10:19 AM

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.

(2) BOOL OpenClipboard(HWND hWndNewOwner);

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

(3) BOOL CloseClipboard(void);

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.

(4) HANDLE SetClipboardData(UINT uFormat, HANDLE hMem );

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.

(5) BOOL IsClipboardFormatAvailable( UINT format ); Mit dieser Funktion wird ermittelt, ob das Datenformat in der Zwischenablage dem durch format angegebenen Format entspricht.


(6) HANDLE GetClipboardData( UINT uFormat );

Diese Funktion gibt ein Handle für das Zwischenablageobjekt zurück, das in der Zwischenablage im angegebenen Format gemäß dem von uFormat angegebenen Format vorhanden ist.


2. Gemeinsam genutzte Speicherzuweisung

(1) HGLOBAL WINAPI GlobalAlloc( UINT uFlags, SIZE_T dwBytes );

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.

(5) BOOL WINAPI GlobalUnlock( HGLOBAL hMem );

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.

(6) HGLOBAL WINAPI GlobalFree( HGLOBAL hMem );

Diese Funktion gibt den globalen Speicherblock frei.
Der erste Parameter hMem stellt das von der GlobalAlloc-Funktion zurückgegebene Datenobjekthandle dar.

Im Folgenden finden Sie einen Beispielcode, indem Sie auf Ihrem eigenen Computer Strg+C (Daten in die Zwischenablage kopieren) oder Strg+V (Daten aus der Zwischenablage kopieren) ausführen:

// 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] = &#39;a&#39;+i;                //在全局内存中赋值
    }

   GlobalUnlock(pClipData);//内存控制句柄解锁,其他进程可以访问

   if(!OpenClipboard(hWnd))//打开剪贴板
   {       cout<<"OPen fail!"<<endl;       return 0; 
   }

   EmptyClipboard();//清空剪贴板,这一步才真正拥有剪贴板
   SetClipboardData(CF_TEXT,pClipData);//将共享内存里的数据放入剪贴板
   CloseClipboard();//关闭剪贴板

   cout<<"剪贴完成"<<endl;   return 0;
}
Nach dem Login kopieren
rrree

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

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

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

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.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

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

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

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.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

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

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

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.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

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

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

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.

See all articles