WindowsVista以降だとCreateFileMapping()でGlobalのプレフィックスを付けた名前で共有メモリは作成できない

うーむ。そうなのか・・・

WindowsVistaだと、管理者権限のないユーザーでログインしてWindowsアプリケーション
を起動すると、CreateFileMapping関数がERROR_ACCESS_DENIED(アクセス拒否)で失敗し
ます。
管理者権限のないユーザーでログインしていると、Globalのプレフィックスを付けた名前
では共有メモリは作成できないのでしょうか?
Globalのプレフィックスを付けないと、Windowsサービスプログラムとはメモリを共有で
きませんし・・・。
MSDN にある通り
http://msdn.microsoft.com/en-us/library/aa366537.aspx

> 管理者権限のないユーザーでログインしていると、Globalのプレフィックスを付けた
> 名前では共有メモリは作成できないのでしょうか?

はい。
正確には、SeCreateGlobalPrivilege 特権が必要です。

解決策は3つ。

1:その DLL を使うアプリを要昇格にする。
2:そのアプリを使うユーザーに SeCreateGlobalPrivilege を付与する
3:アプリではなくサービス側で共有メモリを作成し、アプリは OpenFileMapping する

個人的には 3 をお勧めします。


ネタ元