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

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

坏嘻嘻
坏嘻嘻Original
2018-09-15 10:19:132322Durchsuche

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;
}
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!

Stellungnahme:
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