ホームページ  >  記事  >  Java  >  C++ MFCのプロセス間通信のクリップボードを理解する方法

C++ MFCのプロセス間通信のクリップボードを理解する方法

坏嘻嘻
坏嘻嘻オリジナル
2018-09-15 10:19:132256ブラウズ

この記事の内容は、C MFC のプロセス間通信のクリップボードを理解する方法についてです。必要な方は参考にしていただければ幸いです。

#Windows クリップボードは比較的単純なプロセス間通信メカニズムであり、そのオーバーヘッドは比較的小さいです。その実装原理は非常に単純です。実際、これはオペレーティング システムによって維持されるメモリ領域です。
このメモリ領域は別のプロセスに属しませんが、プロセスが必要なときにこのメモリ領域にアクセスできます。がメモリ領域に配置され、別のプロセスがメモリ領域からデータを取得して通信を行うことができます。実装プロセスは、共有メモリ操作とクリップボード操作の 2 つの部分で構成されます。
1. クリップボードの操作
(1) HWND GetClipboardOwner();
関数: クリップボードの現在の所有者を指すハンドルを取得します。
この関数が正常に実行されると、所有するウィンドウが返されます。クリップボードのハンドル。それ以外の場合は、NULL が返されます。

(2) BOOL OpenClipboard(HWND hWndNewOwner);
最初のパラメータ hWndNewOwner は、このパラメータが NULL に設定されている場合、このウィンドウがクリップボードを開くことを意味します。現在のタスクまたはプロセスを含むクリップボードを開きます。クリップボードが正常に開かれた場合、この関数は 0 以外の値を返します。別のプログラムがすでにクリップボードを開いている場合、現在のプログラムはクリップボードを開くことができないため、クリップボードを開くことは失敗し、関数は 0 の値を返します。実際、これは考えてみると簡単に理解できます。クリップボードにはそのようなメモリ領域しかありません。プロセス A はそこにデータを書き込みたいので、そこにデータを書き込む必要はありません。この混乱を解決する方法は、プロセス A がクリップボードにデータを書き込んでいる場合 (プロセス A がクリップボードを開いていると理解できます)、プロセス B はデータをクリップボードに書き込むことができないためです。次に、プロセス B がクリップボードを開くのを失敗させます。したがって、プログラムがクリップボードを開いている場合、クリップボードを開いたプログラムが CloseClipboard 関数を呼び出すまで、他のアプリケーションはクリップボードを変更できません。そして、EmptyClipboard 関数を呼び出した後にのみ、現在のウィンドウはクリップボードを開くことができます。クリップボードがある

(3) BOOL CloseClipboard(void);
プロセスがクリップボードを開いた場合、そのプロセスがクリップボード ハンドルを閉じるために CloseClipboard 関数を呼び出さないと、他のプロセスは開くことができません。クリップボードなので、使用するたびにクリップボードを閉じる必要があります。ここでクリップボードを閉じても、現在クリップボードを開いているプログラムがクリップボードの所有権を失うわけではないことに注意してください。EmptyClipboard 関数を呼び出すプログラムは、別のプログラムがクリップボードの所有権を失うことになります。クリップボード。

(4) HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
SetClipboardData 関数は、指定されたクリップボード形式でデータをクリップボードに配置するために使用されます。最初のパラメータ uFormat は、CF_BITMAP、CF_TEXT、CF_DIB など、クリップボードに配置されるデータの形式を指定するために使用されます (他の形式については、MSDN を参照してください)。 2 番目のパラメータ hMem は、指定された形式のデータのハンドルを指定するために使用されます。このパラメータが NULL の場合は、プログラムがクリップボード内のデータを要求するまで、プログラムはそのデータを保持することを示します。クリップボード所有権プロセスは、データをクリップボードにコピーします。つまり、指定されたクリップボード形式でデータを提供します。この遅延送信テクノロジについては、後で詳しく説明します。

(5) BOOL IsClipboardFormatAvailable( UINT format );
この関数は、クリップボード上のデータ形式が format で指定された形式であるかどうかを判断するために使用されます。

(6) HANDLE GetClipboardData( UINT uFormat );
この関数は、uFormat で指定された形式に従って、指定された形式でクリップボードに存在するクリップボード オブジェクトへのハンドルを返します。

2. 共有メモリの割り当て
(1) HGLOBAL WINAPI GlobalAlloc( UINT uFlags, SIZE_T dwBytes );
最初のパラメータ uFlags は、メモリの割り当て方法を指定するために使用されます。その値は次のリストに示すとおりです。ただし、クリップボードを使用する場合は、動的なデータ交換を実現する必要があるため、GHND または GMEM_MOVEABLE を使用する必要があります。
GHND GMEM_MOVEABLE と GMEM_ZEROINIT の組み合わせ。
GMEM_FIXED 固定メモリを割り当て、戻り値はポインタになります。
GMEM_MOVEABLE 移動可能なメモリを割り当てます。
GMEM_ZEROINIT メモリ内容を 0 に初期化します。
GPTR これは、GMEM_FIXED と GMEM_ZEROINIT の組み合わせです。
2 番目のパラメータ dwBytes は、割り当てられるバイト数を指定するために使用されます。

(2) HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);
この関数は再割り当て関数、つまり元のデータ オブジェクト hMem 上のメモリ空間を拡張します。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。
2 番目のパラメータ dwBytes は、再割り当てが必要なメモリのサイズを指定します。
3 番目のパラメータ uFlags は、割り当て方法を指定します (GlobalAlloc 関数を参照)。

(3) SIZE_T WINAPI GlobalSize( HGLOBAL hMem );
この関数は、メモリ ブロックのサイズを返すために使用されます。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

(4) LPVOID WINAPI GlobalLock( HGLOBAL hMem );
この関数の機能は、グローバル メモリ オブジェクトをロックし、オブジェクトのメモリ ブロックの最初のバイトへのポインタを返すことです。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

(5) BOOL WINAPI GlobalUnlock( HGLOBAL hMem );
上記の GlobalLock 関数を通じて、このグローバル メモリへのアクセスを取得できます。
ロックとは、このメモリがすでに使用されていることを意味します。プログラムはこのグローバル メモリを使用できなくなります。ロックを解除しなくても、他のプログラムはこのグローバル メモリを使用できなくなります。これはまだグローバル メモリと呼ばれています。したがって、この関数はグローバル メモリ オブジェクトのロックを解除するために使用されます。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

(6) HGLOBAL WINAPI GlobalFree( HGLOBAL hMem );
この関数は、グローバル メモリ ブロックを解放します。
最初のパラメータ hMem は、GlobalAlloc 関数によって返されるデータ オブジェクト ハンドルを表します。

次のサンプル コードは、読者が自分のコンピュータで Ctrl C (クリップボードにデータをコピー) Ctrl V (クリップボードからデータをコピー) を実行することによって、特定のテストを実行することもできます。

以上がC++ MFCのプロセス間通信のクリップボードを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。