Обмен данными между процессами
От: Bill133  
Дата: 15.03.02 09:17
Оценка:
TCHAR *pGlobal;

HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 8, "_OPC_DATE_");
pGlobal =(TCHAR *):: MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,100);

pGlobal[4100]=1; //ВСЕ компилируется но при работе программы на этой строчке выдает ошибку, (т.е. если адресс больше 4096)
"Access violation at adress 00401D5C in module 'Proect1.exe'. Write address 011F1004."
Re: Обмен данными между процессами
От: Willi  
Дата: 15.03.02 09:30
Оценка:
Здравствуйте Bill133, Вы писали:

B>TCHAR *pGlobal;


B>HANDLE hFile = INVALID_HANDLE_VALUE;

B>HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 8, "_OPC_DATE_");
B>pGlobal =(TCHAR *):: MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,100);

B>pGlobal[4100]=1; //ВСЕ компилируется но при работе программы на этой строчке выдает ошибку, (т.е. если адресс больше 4096)

B>"Access violation at adress 00401D5C in module 'Proect1.exe'. Write address 011F1004."

По хорошему оно должно вылетать по ошибке в случае если ты адресуешь далше 8-го байта от pGlobal, посмотри что ты передаешь в качестве пятого памаетра в CreateFileMapping. Вылетает после после 4096 скорее всего потому, что минимальный размер страницы равен 4Kb, т.е. 4096 байт.
\/\/i||i
Re[2]: Обмен данными между процессами
От: Bill133  
Дата: 15.03.02 09:42
Оценка:
Здравствуйте Willi, Вы писали:

W>Здравствуйте Bill133, Вы писали:


B>>TCHAR *pGlobal;


B>>HANDLE hFile = INVALID_HANDLE_VALUE;

B>>HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 8, "_OPC_DATE_");
B>>pGlobal =(TCHAR *):: MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,100);

B>>pGlobal[4100]=1; //ВСЕ компилируется но при работе программы на этой строчке выдает ошибку, (т.е. если адресс больше 4096)

B>>"Access violation at adress 00401D5C in module 'Proect1.exe'. Write address 011F1004."

W>По хорошему оно должно вылетать по ошибке в случае если ты адресуешь далше 8-го байта от pGlobal, посмотри что ты передаешь в качестве пятого памаетра в CreateFileMapping. Вылетает после после 4096 скорее всего потому, что минимальный размер страницы равен 4Kb, т.е. 4096 байт.


В том то идело что какое бы значение dwMaximumSizeLow я бы не ставил, всеравно вылетает ошибка, и как увеличить минимальный размер страницы.
Re[3]: Обмен данными между процессами
От: Willi  
Дата: 15.03.02 09:59
Оценка: 3 (1)
Здравствуйте Bill133, Вы писали:

B>Здравствуйте Willi, Вы писали:


W>>Здравствуйте Bill133, Вы писали:


B>>>TCHAR *pGlobal;


B>>>HANDLE hFile = INVALID_HANDLE_VALUE;

B>>>HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 8, "_OPC_DATE_");
B>>>pGlobal =(TCHAR *):: MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,100);

B>>>pGlobal[4100]=1; //ВСЕ компилируется но при работе программы на этой строчке выдает ошибку, (т.е. если адресс больше 4096)

B>>>"Access violation at adress 00401D5C in module 'Proect1.exe'. Write address 011F1004."

W>>По хорошему оно должно вылетать по ошибке в случае если ты адресуешь далше 8-го байта от pGlobal, посмотри что ты передаешь в качестве пятого памаетра в CreateFileMapping. Вылетает после после 4096 скорее всего потому, что минимальный размер страницы равен 4Kb, т.е. 4096 байт.


B>В том то идело что какое бы значение dwMaximumSizeLow я бы не ставил, всеравно вылетает ошибка, и как увеличить минимальный размер страницы.


Размер страницы — никак.

Четвертый и пятый параметр CreateFileMapping задают размер маппинга.
Кроме того важное значение имеет последний параметр MapViewOfFile. Он определяет количество байт которое ты хочешь отбразить в свою память.

Вот так все работает
    HANDLE hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 8192, "_OPC_DATE_"); 
    BYTE* pData = (LPBYTE)::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 8192);

    pData[4100] = 1;

    ::UnmapViewOfFile(pData);
    ::CloseHandle(hMap);
\/\/i||i
Re[4]: Обмен данными между процессами
От: Bill133  
Дата: 15.03.02 10:04
Оценка:
Здравствуйте Willi, Вы писали:

W>Здравствуйте Bill133, Вы писали:


B>>Здравствуйте Willi, Вы писали:


W>>>Здравствуйте Bill133, Вы писали:


B>>>>TCHAR *pGlobal;


B>>>>HANDLE hFile = INVALID_HANDLE_VALUE;

B>>>>HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 8, "_OPC_DATE_");
B>>>>pGlobal =(TCHAR *):: MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,100);

B>>>>pGlobal[4100]=1; //ВСЕ компилируется но при работе программы на этой строчке выдает ошибку, (т.е. если адресс больше 4096)

B>>>>"Access violation at adress 00401D5C in module 'Proect1.exe'. Write address 011F1004."

W>>>По хорошему оно должно вылетать по ошибке в случае если ты адресуешь далше 8-го байта от pGlobal, посмотри что ты передаешь в качестве пятого памаетра в CreateFileMapping. Вылетает после после 4096 скорее всего потому, что минимальный размер страницы равен 4Kb, т.е. 4096 байт.


B>>В том то идело что какое бы значение dwMaximumSizeLow я бы не ставил, всеравно вылетает ошибка, и как увеличить минимальный размер страницы.


W>Размер страницы — никак.


W>Четвертый и пятый параметр CreateFileMapping задают размер маппинга.

W>Кроме того важное значение имеет последний параметр MapViewOfFile. Он определяет количество байт которое ты хочешь отбразить в свою память.

W>Вот так все работает

W>
W>    HANDLE hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 8192, "_OPC_DATE_"); 
W>    BYTE* pData = (LPBYTE)::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 8192);

W>    pData[4100] = 1;

W>    ::UnmapViewOfFile(pData);
W>    ::CloseHandle(hMap);

W>



БОЛЬШОЕ СПАСИБО!!!!!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.