1

私はHGLOBALs について何かを理解しようとしています。なぜなら、私が考えていたことが単に間違っていることがわかったからです。

アプリの AIGlobalAlloc()データ (with GMEM_SHARE|GMEM_MOVABLE) で、その中に文字列"Test"を配置します。では、そのデータを取得するために別のアプリケーションに何を与えることができるでしょうか?

HGLOBALs はすべてのプロセスで有効ですが、これは明らかに間違っていHGLOBALますHANDLE。 はグローバル データへのポインタであり、グローバル データへのポインタではないからです (ここで「OHHHH!」と言いました) 。

HGLOBALでは、どうすればを別のアプリケーションに渡すことができますか?

注意:クリップボードのように、データ自体ではなく、データへの「ポインター」のみを渡したいです。

どうもありがとう!:-)

4

4 に答える 4

3

(Win32はメモリ共有に対して異なるアプローチを採用していると他の人がすでに説明しているため、これは非常に長いコメントです。)

Win16はかなり長い間事実上死んでいるので、かなり古くて時代遅れのWindowsプログラミングに関する本(またはチュートリアル)を読んでいると思います。

16ビットWindows(3.x)には、32ビット(およびそれ以降)のWindowsバージョンが提供するメモリ分離(または仮想/フラット/アドレス空間)の概念がありませんでした。そこでのメモリは、ローカル(プロセスに対して)セクションとグローバルセクションに分割され、どちらも同じグローバルアドレス空間に存在していました。のような記述子HGLOBALは、メモリブロックを物理メモリ内で移動し、アドレス空間内の新しい場所に関係なく正しくアクセスできるようにするために使用されました(LocalLock()/で適切に固定した後GlobalLock())。Win32は、仮想アドレス空間での位置に影響を与えることなく物理メモリページを移動できるため、代わりにポインタを使用します。Global*互換性の理由から、すべてのAPI関数を引き続き提供しますLocal*が、これらは使用しないでください。代わりに、通常のヒープ管理を使用する必要があります(例:malloc()CまたはnewC++の演算子)。また、x86で使用可能ないくつかの異なるアドレッシングモード(near(同じセグメント)、far(セグメント:offset)、およびhuge(正規化されたsegment:offset))を反映するために、Win16にはいくつかの異なる種類のポインターが存在しました。Win32に移植されたレガシーWin16コードのようなものを引き続き見ることができますがFARPTR、フラットモードではポインターの近くでのみ使用されるため、空の文字列として定義されます。

于 2012-10-01T16:54:56.270 に答える
2

GMEM_SHAREフラグと混同しないでください。あなたが想定していたようには機能しません。MSDNから:

次の値は廃止されましたが、16 ビット Windows との互換性のために提供されています。それらは無視されます。

GMEM_SHARE

GMEM_SHARERaymond Chen によって説明されたフラグ:

16 ビット Windows では、GMEM_SHARE フラグは、メモリを割り当てたプロセスよりも長くメモリを存続させるかどうかを制御していました。

別のプロセス/アプリケーションとメモリを共有するには、代わりにFile Mappings : Memory-mapped files and how they work を参照してください。

于 2012-09-27T10:56:08.383 に答える
2

各プロセスは、コンピューター上で使用可能な完全なメモリ空間を所有していると「考え」ます。どのプロセスも、別のプロセスのメモリ空間を「見る」ことはできません。そのため、通常、プロセスが保存するものは別のプロセスから見ることはできません。

プロセス間で情報を渡す必要がある場合があるため、この機能を提供する特定のメカニズムが存在します。

1 つのアプローチはメッセージ パッシングです。たとえば、パイプやソケットを介して、または Windows メッセージによって、1 つのプロセスが別のプロセスにメッセージを発行します。

もう 1 つは共有メモリです。共有メモリでは、メモリの特定のブロックが 2 つ以上のプロセスで使用可能になり、1 つのプロセスが書き込んだ内容を他のプロセスが見ることができます。

于 2012-09-27T10:50:23.657 に答える
2

ドキュメントを読んでください。32 ビット処理の導入により、GlobalAlloc()実際にはグローバル メモリが割り当てられなくなりました。

メモリブロックを別のプロセスと共有するには、ブロックを割り当ててGlobalAlloc()クリップボードに置き、他のプロセスに取得させることができます。CreateFileMapping()または、代わりにandを使用して共有メモリのブロックを割り当てることができますMapViewOfFile()

于 2012-09-27T22:16:28.660 に答える