Вопрос

Я хочу реализовать МПК с использованием именованной общей памяти.

Для этого один из шагов - получить ручку к Картирование объекта памяти, с использованием CreateFileMapping ().

Я делаю это точно так же, как рекомендуют веб -сайт MSDN: 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 Бит Ос
  • Администратор Права пользователя доступны
  • Разработанное приложение: 64-битное плагическое приложение (.dll)

У кого -нибудь такой же опыт, и способ исправить это, пожалуйста? Я использую сайт MSDN в качестве ссылки, поэтому я не думаю, что в коде есть проблемы.

Это было полезно?

Решение

Похоже, у вас недостаточно привилегий.

От MSDN:

Создание объекта сопоставления файлов в глобальном пространстве имен из сеанса, кроме Session Zero, требует привилегии SecreateGlobalPrivilege. Для получения дополнительной информации см. Промыслы имен объектов ядра.

...

Создание объекта со картинами файлов в глобальном пространстве имен, используя CreateFileMapping, из сеанса, отличного от Session Zero, является привилегированной операцией. Из-за этого приложение, работающее в произвольном сеансе сеанса сеанса на рабочем столе (хост сеанса RD), должно быть включено SecreateGlobalPrivilege для успешного создания объекта отображения файлов в глобальном пространстве имен. Проверка привилегий ограничена созданием объектов картирования файлов и не применяется к открытию существующих. Например, если служба или система создают объект отображения файлов, любой процесс, работающий в любом сеансе, может получить доступ к этому объекту со отображением файлов, при условии, что пользователь имеет необходимый доступ.

Другие советы

Администраторы, услуги и сетевые услуги по умолчанию имеют secreateglobalprivilege. Вы должны помнить, однако, что Windows7/Vista не запускает все как администратор. Так что используйте «Начните как администратор», чтобы сделать «Global » работать для вашего приложения. Если вы отлаживаете, начните Visual Studio в качестве администратора.

Для создания глобальных отображений файлов вам нужны SeCreateGlobalPrivilege Привилегия - у вас есть это? Наверняка подразумевает, что это проблема с разрешениями.

Ссылка на службы терминала в документации о глобальном пространстве имен немного вводит в заблуждение, поскольку подразумевает, что вам нужно беспокоиться об этом, только если у вас есть необычная ситуация.

На самом деле как IIS, так и системные службы работают в Session Zero, и первый / единственный пользователь, который входит в систему запуска в сессии 1 - поэтому вам нужно использовать глобальное пространство имен для связи между IIS или службой и обычной программой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top