Как вы можете записать информацию в «глобальную (в памяти) переменную» Windows, которая может использоваться различными приложениями с помощью Windows API? - PullRequest
2 голосов
/ 28 ноября 2008

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

Предположим, есть два строковых значения, которые я хочу разделить между двумя независимыми приложениями.

Вы можете предоставить пример кода на любом языке программирования.

Ответы [ 2 ]

5 голосов
/ 28 ноября 2008

Что вы, вероятно, хотите сделать, это создать файл с отображением в памяти. Вы можете создать файл с отображением в памяти, который не имеет резервного хранилища на диске, но вместо этого поддерживается файлом системной страницы. Посмотрите документацию для CreateFileMapping, особенно когда первый параметр равен INVALID_HANDLE_VALUE.

Вы можете присвоить такому сопоставлению файлов уникальное общесистемное имя, а затем другие приложения смогут открывать его, используя OpenFileMapping и предоставляя то же имя.

Если у вас есть такой блок совместно используемой памяти, вы можете поместить в него любую информацию, которая вам нравится. Обратите внимание, что, поскольку память распределяется между процессами, вы не хотите хранить какие-либо указатели в блоке памяти (что исключает выполнение таких вещей, как сохранение std::string там).

3 голосов
/ 28 ноября 2008

Рекомендуемый подход - создать именованное отображение памяти (CreateFileMapping, возможно, с INVALID_HANDLE_VALUE в качестве первого параметра, поскольку вам не нужен фактический файл) и поместить ваши общие данные в отображение. Вам также потребуется именованный мьютекс для синхронизации доступа к этим данным.

Ленивый подход заключается в использовании #pragma data_seg (для MSVC; другие компиляторы имеют аналогичные инструменты), чтобы поместить ваши данные в общий раздел. Обратите внимание, что MSVC требует явной инициализации данных; в противном случае он перейдет в обычный раздел данных даже без предупреждения.

Недостаток второго подхода в том, что здесь не применяется защита, поэтому любой пользователь (даже между сеансами) будет иметь доступ к разделу общего доступа. Другая проблема состоит в том, что только экземпляры одного и того же исполняемого файла (или DLL) будут разделять раздел; то есть, если вы скопируете .exe и запустите его из двух разных мест, данные не будут переданы в общий доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...