Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 3
Регистрация: 19.08.2013
Сообщений: 100

WinApi отображение файла на память, virtualalloc, createfilemapping, MapViewOfFile

24.04.2017, 19:26. Показов 2454. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, прошу прощение если ошибся разделом.
стоит задача: Организовать текстовый буфер обмена между двумя приложениями средствами проецируемых в память файлов. Будут запускаться 2 экземпляра программы, в любую из них вводится текст, отправляется в память, и в любой из них этот текст выводится... проблема с функцией MapViewOfFile , не могу понять как и где вызвать, устал от ошибок "попытка записи в защищенную память". Выкладываю код который работает для одного экземпляра приложения, строка отправляется и достается из памяти, но я так понял это всего лишь виртуальная память процесса...


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
namespace WindowsFormsApplication22
{
    public partial class Form1 : Form
    {
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern System.IntPtr OpenFileMapping(uint dwDesiredAccess,
                                             bool bInheritHandle,
                                             string lpName);
 
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject,
                                           uint dwDesiredAccess,
                                           uint dwFileOffsetHigh,
                                           uint dwFileOffsetLow,
                                           uint dwNumberOfBytesToMap);
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr CreateFileMapping(
            IntPtr hFile,
            IntPtr lpFileMappingAttributes,
            uint flProtect,
            uint dwMaximumSizeHigh,
            uint dwMaximumSizeLow,
            string lpName);
        [Flags]
        enum FileMapProtection : uint
        {
            PageReadonly = 0x02,
            PageReadWrite = 0x04,
            PageWriteCopy = 0x08,
            PageExecuteRead = 0x20,
            PageExecuteReadWrite = 0x40,
            SectionCommit = 0x8000000,
            SectionImage = 0x1000000,
            SectionNoCache = 0x10000000,
            SectionReserve = 0x4000000,
        }
        
        const UInt32 STANDARD_RIGHTS_REQUIRED = 0x000F0000;
        const UInt32 SECTION_QUERY = 0x0001;
        const UInt32 SECTION_MAP_WRITE = 0x0002;
        const UInt32 SECTION_MAP_READ = 0x0004;
        const UInt32 SECTION_MAP_EXECUTE = 0x0008;
        const UInt32 SECTION_EXTEND_SIZE = 0x0010;
        const UInt32 SECTION_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
            SECTION_MAP_WRITE |
            SECTION_MAP_READ |
            SECTION_MAP_EXECUTE |
            SECTION_EXTEND_SIZE);
        const UInt32 FILE_MAP_ALL_ACCESS = SECTION_ALL_ACCESS;
 
 
 
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        reg r;// класс для выделения виртуальной памяти в процессе, код в спойлере
 
        System.IntPtr g_hMapFile;
        public Form1()
        {
            InitializeComponent();
            g_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, "AYE");
 
            if (g_hMapFile == IntPtr.Zero)
            {
                MessageBox.Show("файла нет, создаем");
                g_hMapFile = CreateFileMapping(new IntPtr(-1), (IntPtr)null, (uint)FileMapProtection.PageReadWrite, 0, 1 * 1024 * 1024, "AYE");
 
            }
            else MessageBox.Show("файл уже создан другим экземпляром программы)");
 
            if(g_hMapFile==IntPtr.Zero)
            {
                MessageBox.Show("ошибка");
            }
            r = new reg(1024 * 1024);//класс для выделения памяти в процессе
            r.sadress = MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);//проблемная строка которую надо как то использовать по другому
            
            
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            //тут предполагаю что надо как то вызвать MapViewOfFile 
 
 
          //достаем строку из памяти процесса
            UnicodeEncoding uniEncoding = new UnicodeEncoding();
            byte[] b=new byte[1024*1024];
          
            Marshal.Copy(r.sadress, b, 0, 1024 * 1024);
            string s = uniEncoding.GetString(b);
 
            MessageBox.Show(s);
        }
 
        private unsafe void button1_Click(object sender, EventArgs e)
        {
            //запись в память процесса
            string s = textBox1.Text;
 
            UnicodeEncoding uniEncoding = new UnicodeEncoding();
            byte[] b= uniEncoding.GetBytes(s);
            Marshal.Copy(b,0, r.sadress, b.Length); 
            //тут предполагаю что надо как то вызвать MapViewOfFile 
 
 
 
         }
    }
}
и класс для выделения виртуальной памяти в процессе
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 class reg
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
        [DllImport("kernel32.dll")]
        public static extern bool VirtualFree(IntPtr lpAddress,
      uint dwSize, uint dwFreeType);
 
        public UIntPtr size { get; set; }
        public IntPtr sadress { get; set; }
 
        unsafe public reg(int s)
        {
            this.sadress = VirtualAlloc((IntPtr)null, (UIntPtr)(s), AllocationType.RESERVE | AllocationType.COMMIT, MemoryProtection.READWRITE);
            this.size = (UIntPtr)s;
        }
 
        public void freeMem(IntPtr adres, uint size)
        {
            VirtualFree(adres, size, (uint)FreeType.Decommit);
        }
 
 
        public bool freeReg()
        {
            return VirtualFree(this.sadress, 0, (uint)FreeType.Release);
 
        }
    }
    [Flags]
    public enum FreeType
    {
        Decommit = 0x4000,
        Release = 0x8000,
    }
 
    [Flags()]
    public enum AllocationType : uint
    {
        COMMIT = 0x1000,
        RESERVE = 0x2000,
        RESET = 0x80000,
        LARGE_PAGES = 0x20000000,
        PHYSICAL = 0x400000,
        TOP_DOWN = 0x100000,
        WRITE_WATCH = 0x200000
    }
 
    [Flags()]
    public enum MemoryProtection : uint
    {
        EXECUTE = 0x10,
        EXECUTE_READ = 0x20,
        EXECUTE_READWRITE = 0x40,
        EXECUTE_WRITECOPY = 0x80,
        NOACCESS = 0x01,
        READONLY = 0x02,
        READWRITE = 0x04,
        WRITECOPY = 0x08,
        GUARD_Modifierflag = 0x100,
        NOCACHE_Modifierflag = 0x200,
        WRITECOMBINE_Modifierflag = 0x400
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2017, 19:26
Ответы с готовыми решениями:

Обмен данными между процессами (с использованием CreateFileMapping, MapViewOfFile, UnMapViewOfFile)
Помогите кто может и чем может, пожалуйста. Нужно разработать приложение, с помощью которого можно осуществить обмен данными между...

Зачем нужны функции MapViewOfFile, CreateFileMapping и что в них обозначает слово Map?
Зaчем нужны функции MapViewOfFile, CreateFileMapping и т.д. Что они делают, для чего предназначены ?? Что означает слово маппирует ?

Используя функции CreateFileMapping и MapViewOfFile прочитать файл размером более 4 Gb "кусками"
Задача: Используя функции CreateFileMapping и MapViewOfFile прочитать файл "кусками", и обработать каждый соответствующий кусок. Как...

1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.04.2017, 20:51
Цитата Сообщение от max_1296 Посмотреть сообщение
задача: Организовать текстовый буфер обмена между двумя приложениями средствами проецируемых в память файлов.
Вопрос-а чем не устроили имеющиеся в FCL средства (PipeStream, MemoryMappedFile), что вам пришлось лезть в дебри WinAPI?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2017, 20:51
Помогаю со студенческими работами здесь

функция winApi CreateFileMapping()
Сейчас столкнулся с проблемой. Полное непонимание FileMapping Есть следующий код. Он должен выводить в мемо строку из swap-файла.. Не...

Отображение файла в памяти, используя WinApi
Я пытаюсь сделать так,что бы в одном процессе создавался файл, в него загружались полученные вычисления и после этого файл отображался в...

Чтобы процесс удачно запросил виртуальную память, он должен вызвать VirtualAlloc дважды?
Изучаю виртуальную память. Ребята, я жирным выделил места, на которые надо обратить особое внимане Ну вот, собсно и всё. Вот я и...

Отображение файла в память
Здравствуйте! Помогите разобраться. Задача состоит в том что с клиента на сервер передается массив используя файлы, отображаемые в память....

Отображение файла в оперативную память
Реализовать отображение файла в оперативную память. Выполнить задание, с использованием этого отображения. Задание: Создать массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru