17

名前付き共有メモリを使用して IPC を実装したいと考えています。

これを行うための手順の 1 つは、 CreateFileMapping()を使用してMapping Memory Objectへのハンドルを取得することです。

MSDN Web サイトが推奨するとおりに実行します: http://msdn.microsoft.com/en-us/library/aa366551(v=VS.85).aspx :

hFileMappingHandle = CreateFileMapping
    (
        INVALID_HANDLE_VALUE,      // use paging file
        NULL,                      // default security 
        PAGE_READWRITE,            // read/write access
        0,            // maximum object size (high-order DWORD) 
        256,            // maximum object size (low-order DWORD)  
        "Global\\MyFileMappingObject"          // name of mapping object
    ); 
DWORD dwError = GetLastError();

ただし、返されるハンドルは常に0x0で、返されるシステム エラー コード0x5 (アクセスが拒否されました) です。

  • 名前付きメモリ共有のみが必要です (ファイル共有ではありません)。
  • Windows 7 x64ビット OS
  • 管理者のユーザー権限が利用可能
  • 開発アプリケーション: 64bit Plug-In アプリケーション(.dll)

どなたか同じ経験のある方、改善方法を教えてください。私はMSDNのサイトを参考にしているので、コードに問題があるとは思いません。

4

6 に答える 6

13

十分な権限がないようです。

MSDN から:

セッション 0 以外のセッションからグローバル名前空間にファイル マッピング オブジェクトを作成するには、SeCreateGlobalPrivilege 権限が必要です。詳細については、カーネル オブジェクトの名前空間を参照してください。

...

CreateFileMapping を使用して、セッション 0 以外のセッションからグローバル名前空間にファイル マッピング オブジェクトを作成することは、特権操作です。このため、グローバル名前空間にファイル マッピング オブジェクトを正常に作成するには、任意のリモート デスクトップ セッション ホスト (RD セッション ホスト) サーバー セッションで実行されているアプリケーションで SeCreateGlobalPrivilege を有効にする必要があります。権限チェックは、ファイル マッピング オブジェクトの作成に限定されており、既存のオブジェクトを開く場合には適用されません。たとえば、サービスまたはシステムがファイル マッピング オブジェクトを作成する場合、ユーザーが必要なアクセス権を持っていれば、任意のセッションで実行されているすべてのプロセスがそのファイル マッピング オブジェクトにアクセスできます。

于 2010-10-22T17:06:25.753 に答える
2

管理者、サービス、およびネットワーク サービスには、デフォルトで SeCreateGlobalPrivilege があります。ただし、Windows7/Vista ではすべてを管理者として実行するわけではないことに注意してください。したがって、「管理者として開始」を使用して、アプリケーションで「グローバル\」を機能させます。デバッグしている場合は、Visual Studio も管理者として起動します。

于 2011-08-15T11:23:09.120 に答える
1

グローバル ファイル マッピングを作成するには、SeCreateGlobalPrivilege権限が必要です - 持っていますか? アクセス拒否は、これがパーミッションの問題であることを意味します。

于 2010-10-22T17:06:39.063 に答える
0

グローバル名前空間に関するドキュメントの端末サービスへの言及は、通常とは異なる状況が発生した場合にのみこれについて心配する必要があることを示唆しているため、少し誤解を招く可能性があります。

実際、IIS とシステム サービスの両方がセッション 0 で実行され、ログオンする最初/唯一のユーザーがセッション 1 で実行されるため、IIS またはサービスと通常のプログラムの間で通信するには、グローバル名前空間を使用する必要があります。

于 2014-10-24T12:47:48.840 に答える