7

プロセス間通信に共有メモリ---つまり---メモリマップトファイルを使用するWindowsアプリケーションを開発しました。いくつかの処理を実行し、メモリマップトファイルに定期的にデータを書き込むWindowsサービスがあります。メモリマップトファイルから読み取り、情報を表示する別のWindowsアプリケーションがあります。このアプリケーションは、Windows XP、XP Pro、およびServer 2003で期待どおりに動作しますが、Vistaでは動作しません。

テキストエディタでファイルを開いて保存されたメッセージを確認できるため、メモリマップトファイルに書き込まれているデータがWindowsサービスによって正しく行われていることがわかりますが、「消費者」アプリケーションはファイルから読み取ることができません。ここで注意すべき興味深い点の1つは、コンシューマーアプリケーションを閉じて再起動すると、以前にメモリマップトファイルに書き込まれたメッセージが消費されることです。

また、別の奇妙なことは、リモートデスクトップを使用してWindowsホストに接続し、リモートデスクトップを介してコンシューマーアプリケーションを呼び出し/使用したときに同じ動作が発生することです。ただし、リモートデスクトップを呼び出し、次のコマンドを使用してターゲットホストのコンソールセッションに接続するとmstsc -v:servername /F -console、すべてが完全に機能します。

そのため、問題は権限に関連していると思います。誰かがこれについてコメントできますか?

編集:

メモリマップトファイルとアクセスを同期するMutexオブジェクトを作成するために使用しているACLは次のとおりです。

TCHAR * szSD = TEXT("D:")
               TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)")
               TEXT("(A;;GA;;;BG)")
               TEXT("(A;;GA;;;AN)")
               TEXT("(A;;GA;;;AU)")
               TEXT("(A;;GA;;;LS)")
               TEXT("(A;;GA;;;RD)")
               TEXT("(A;;GA;;;WD)")
               TEXT("(A;;GA;;;BA)"); 

これは問題の一部かもしれないと思います。

4

4 に答える 4

9

だから私は私の問題の解決策を見つけました:

Windows XP では、ミューテックス、セマフォ、メモリ マップ オブジェクトなどの名前付きカーネル オブジェクトはすべて同じ名前空間に格納されます。そのため、さまざまなユーザー セッションのさまざまなプロセスが、その名前を使用して特定のオブジェクトを参照すると、そのオブジェクトへのハンドルが取得されます。ただし、セキュリティ対策として、Windows ターミナル サービスは、そのセッションで開始されたプロセスから参照されるカーネル オブジェクト用に別の名前空間を作成します。Windows Vista にもこの動作が組み込まれているため、Vista でアプリが正しく動作しませんでした。詳しく説明すると、null セッションで実行される Windows サービスとユーザー セッションで実行されるアプリケーションがあるため、名前付きオブジェクトは別の名前空間に作成されていました。

この問題の簡単な解決策は、使用した各カーネル オブジェクト名の先頭に「Global\」を追加してグローバル名前空間を使用することでした。これでうまくいきました。

于 2008-10-08T20:30:18.340 に答える
3

プレフィックス「Global\」は、共有メモリでは機能しない場合があります。解決策については、「Windows Vista のサービスとドライバーに対するセッション 0 分離の影響」を参照してください。

于 2008-10-09T01:02:37.433 に答える
1

どのアクセス権で共有メモリ セクションを開いていますか? 試してみてFILE_MAP_ALL_ACCESS、下に進んでください。また、生産者と消費者の間に競合状態がないことを確認してください - どちらが共有メモリを作成していますか? 他の人がそれを開こうとする前に、これが作成されていることを確認してください。1 つの方法は、子プロセスを開始する前に親でセクションを作成することです (親/子アーキテクチャを使用している場合)。

共有メモリへのアクセスを許可するには、お子様が Vista で昇格して実行する必要がある場合があります。また、使用しているウィンドウ セッションに関連している可能性もあります。サービスはセッション 0 (私が思うに) で実行されますが、他のアプリ (特にリモート デスクトップ経由でログインする場合) は別のセッションで実行される場合があります。

于 2008-10-06T22:15:13.187 に答える
0

ファイルを別の場所に移動してみましたか。「Shared Documents」フォルダに入れてみてください。これは、Vista で最も自由にアクセスできるフォルダのようです。

于 2008-10-06T22:14:40.347 に答える