2017-10-26 7 views
1

私は、WinAPIと基礎となるWindowsカーネルをよりよく理解しようとしています。これまでのところ、HWND(ウィンドウ)ハンドルをプロセス間で共有することができます。どのWin32ユーザーモードハンドルをプロセス間で共有できますか?

しかし、他のハンドルについては、プロセス間で共有することはできますか?

HMODULE,HINSTANCE,ATOM

としてだけでなく、窓や描画コンポーネント:

HMENUHDCHICONHCURSORHBRUSH、など?

最後に、上記のすべてを共有できない場合は、ユーザーモードのハンドルがありますか?

EDIT:明確化。 を共有することによって、私はハンドルの数値を1つのプロセスから取り出し、別のプロセスで使用することを意味しました。

答えて

1

HMODULEHINSTANCEは、32ビットと64ビットのWindowsでは同じです。これはモジュールのベースアドレスであり、プロセス間で実際に共有することはできません(他のプロセスのビットが同じ場合はntdllとkernel32のアドレスを除く)。

ATOMは、プロセスごとのグローバルフォームとグローバルフォームを同一のプロセスで共有することができます。windowstation

GDI描画ハンドルは共有できません(ただし、GetStockObject?を除く)。

Windows NTでは、GDIオブジェクトはWin32サブシステムのGDIモジュールのクライアント部分に格納されます。つまり、any GDI object is valid only in the context of the application that created itを意味します。

USER32ハンドル(HWND、HMENU、HICON、HCURSOR)を共有することができます。

DuplicateHandleは、デスクトップを受け入れ、ウィンドウステーションハンドル...

+0

のWindows 95/98/MEは異なる場合があります、私はもう詳細は覚えていません。カーネルの一部は16ビットで、セキュリティはないので、ゲームをプレイすることができます。 kernel32、user32、gdi32などのHMODLUEは、特別な高いアドレスでロードされるため、すべて共有できます。これは、これらのシステム上のベースdllではないため、ntdllには当てはまらないかもしれません。 – Anders

+0

情報ありがとうございます。 2つの迅速なフォローアップ。 1)「グローバル」形式の「ATOM」ハンドルを使用するAPIは何ですか? 2)共有すると、あるプロセスのハンドルの数値をとり、別のプロセスのハンドルをHWNDと同じように使うことを意味していました。このような場合、 'HMENU'、' HICON'、 'HCURSOR'は本当に共有できますか? PS。申し訳ありません、upvoteできません。十分なジュースはありません。 – MikeF

+0

@MikeF、[USERオブジェクトハンドル](https://msdn.microsoft.com/en-us/library/ms725486)はセッション内で公開され、関連するデスクトップを開くための読み書きアクセスがある場合に使用できます。通常、グローバルな[アトムテーブル](https://msdn.microsoft.com/en-us/library/ms649053)は、セッション内の唯一のインタラクティブなWindowStation「WinSta0」など、WindowStationにあります。 [JOBOBJECT_BASIC_UI_RESTRICTIONS'](https://msdn.microsoft.com/en-us/library/ms684152)がある場合、プロセスは同じジョブ内のプロセスのUSERオブジェクトとアトムだけに制限されることに注意してください。 – eryksun

関連する問題