2

作成した別のプロセスに構造体へのポインターを渡そうとしています... ポインターを送信しているプロセスで無効なポインターエラーしか得られません... これは.NETでも可能ですか?

送信プロセスの私のコード:

' Initialize unmanged memory to hold the struct.
Dim ptrSettings As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(EngineSettings))

' Copy the struct to unmanaged memory.
Marshal.StructureToPtr(EngineSettings, ptrSettings, False)

SendMessage(HWND, MSG_SETTINGS_STRUCT, 0, ptrSettings)

LParam でメッセージを受信するために、2 番目のプロセスで WinProc をオーバーライドしています。

EngineSettings = CType(Marshal.PtrToStructure(ptr, GetType(SettingsStruct)), SettingsStruct)

' Free the unmanaged memory.
Marshal.FreeHGlobal(ptr)

ポインターは両方のプロセス間で同じ値です。2 番目のプロセスのエラーは次のとおりです。

エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。

4

3 に答える 3

3

通常、プロセスはメモリを共有できません。ほとんどアドレスは実際には仮想アドレスであり、物理的なハードウェアの場所ではなく、ページとオフセットを指していることに注意してください。

win32 関数は、別のプロセスではなくプロセスのアドレス空間内で実行されているため、ポインターを返します。

すべてのネイティブ呼び出しが実際に Win32 で (少なくともユーザー モード コードから) メモリを割り当てる方法の詳細については、Win32 のメモリ管理オプションを参照してください。そのページで言及されていない唯一のことは、非標準のページを作成し、ディスクにページングできないラージページのサポートです。これらのページは、C/C++ でも操作が難しい場合があるため、CLR 内から使用しないことを強くお勧めします。

このネイティブ構造体を直接共有したい場合は、おそらく共有メモリを使用したいと思うでしょう。名前付き共有メモリの作成 (Win32)

于 2012-08-16T15:48:45.013 に答える
1

この種のことについて、メモリマップされたファイルを調べることを提案できますか? ここを見てください:

http://msdn.microsoft.com/en-us/library/dd997372(v=vs.100).aspx

于 2012-08-16T15:46:46.200 に答える
0

クラスを XML にシリアライズし、SendMessage(WM_SETTEXT)それを他のアプリケーションのテキスト ボックスにシリアライズします (hwnd は長いので、現在のコードを使用して非常に簡単に渡すことができます)。次に、テキストボックスの変更イベントにリスナーを配置します。

于 2012-08-16T16:04:14.667 に答える