Здравствуйте!
Мне требуется реализовать обмен текстовыми сообщениями между несколькими процессами. Обеспечить возможность отправки сообщения сразу нескольким адресатам. Реализовать подтверждение приёма сообщения адресатом или, в случае потери сообщения, повторную его передачу. Взаимодействие выполнить с помощью страничного файла.
Возник ряд вопросов..
Пожалуйста, помогите разобраться!
Сначала хочу получить список активных процессов, вывести, скажем, на ListBox и выбрать процессы, которые будут приёмниками текстовых сообщений (а как можно в ListBox осуществить множестсвенный выбор? если вообще можно).
Далее можно из моего приложения открыть файл.
Теперь в процессе-передатчике создаём в памяти проекцию открытого дискового файла и отображаем её на адресное пространство процесса-отправителя с помощью CreateFileMapping(), где будем использовать дескриптор открытого файла...
Процессы же приёмники (выбранные в ListBox) по нажатию кнопки должны отобразить проекцию страничного файла на своё адресное пространство и прочитать данные, которые подлежат передаче...а как это осуществить? мне на понятно...И как это осуществить с учётом того, что получателей должно быть несколько??
И как я понимаю, процесс-приёмник не должен начинать читать из памяти данные раньше, чем их туда запишет отправитель...А как это должно выглядеть? (использовать объекты синхронизации?)
И последнее...В каком виде можно организовать подтверждение приёма сообщений, при чём чтоб было понятно, от какого процесса-приёмника пришло это подтверждение??
Тебе сначала http://rosigma.com/91.aspx: ближе к концу страницы есть тема "Совместный доступ процессов к данным через механизм проецирования"...
По ссылке из предыдущего поста имеется программа-пример MMFShare...На основе её решила выполнять своё задание...
Кое-что не понятно:
По нажатию кнопки у меня происходит следующее:
void OnClickButCreateMap(HWND hwnd)
{
s_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData"));
if (s_hFileMap != NULL) {
if (GetLastError() == ERROR_ALREADY_EXISTS) {
wsprintf(szBufErr,L"Mapping already exists - not created.");
SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr);
CloseHandle(s_hFileMap);
} else {
// File mapping created successfully.
// Map a view of the file into the address space.
pView = MapViewOfFile(s_hFileMap,
FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if (pView != NULL) {
// Put edit text into the MMF.
//? Edit_GetText(GetDlgItem(hwnd, IDC_DATA),
// ? (PTSTR) pView, 4 * 1024);
// Protect the MMF storage by unmapping it.
UnmapViewOfFile(pView);
} else {
wsprintf(szBufErr,L"Can't map view of file.");
SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr);
}
}
} else {
wsprintf(szBufErr,L"Can't create file mapping.");
SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr);
}
}
при компиляции возникла вот такая ошибка:
1>d:\program files\microsoft sdks\windows\v6.0a\include\shtypes.h(51) : error C2144: syntax error : 'int' should be preceded by ';'
что это означает?? и откуда shtypes.h? я даже не использую этот заголовочный файл..
Без понятия... Я открыл CPP-файл в Builder-е, он прекрасно все скомпилировал. Что-то опять у VC не то в библиотеках. Попробуй не открывать тот проект, а создать новый, и добавить в него только CPP-файл.
#ifndef _M_IX86Ты раскомментировала эту строку?
#define UNICODE
#endif
// Чтобы компилировать с использованием Unicode на x86 CPU, раскомментируйте
// строку ниже
// #define UNICODE
/* Forward Declarations */
/* header files for imported files */
#include "wtypes.h"
#ifdef __cplusplus
extern "C"{ //<----
#endif
Все прекрасно компилируется и GCC и Builder-ом 2009, если после подключения Windows.h подключить еще и WindowsX.h (ну, и естественно, добавить недостающие прототипы, которые у тебя в main.h). Выходит, что-то у тебя в настройках самого проекта напортачено.
Добавила действия по нахождению объекта «проекция файла" с именем MMFSharedData...
Предполагается, что программа спроецирует представление объекта на адресное пространство своего процесса и скопирует данные из проецируемого файла в Edit...
Но у меня что-то не так работает, потому что передача сообщения не происходит...
Объясните пожалуйста,в чём причина?
//Main.h
#include "windows.h"
#include <windowsx.h>
#include <tchar.h>
//#include "Psapi.h"
#include "shlwapi.h"
HINSTANCE hInstance;
MSG Msg;
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
bool OnCreate (HWND hwnd, LPCREATESTRUCT);
void OnCommand (HWND hwnd, int id, HWND hw, UINT);
void OnClickButExit();
void OnClickButClear(HWND hwnd);
void OnClickButOpen(HWND hwnd);
void OnClickButCreateMap(HWND hwnd);
void OnClickButOpenMap(HWND hwnd);
void OnClickCloseMap(HWND hwnd);
void OnCommand (HWND hwnd, int id, HWND hw, UINT){
//-------------------------------------------------------------------------------------
if (hw==hButExit) OnClickButExit();
if (hw==hButClear) OnClickButClear(hWndMain);
if (hw==hButOpen) OnClickButOpen(hWndMain);
if (hw==hButCreateMap) OnClickButCreateMap(hWndMain);
if (hw==hButOpenMap) OnClickButCreateMap(hWndMain);
if (hw==hButCloseMap) OnClickCloseMap(hWndMain);
}
void OnCommand (HWND hwnd, int id, HWND hw, UINT){
//-------------------------------------------------------------------------------------
if (hw==hButExit) OnClickButExit();
if (hw==hButClear) OnClickButClear(hWndMain);
if (hw==hButOpen) OnClickButOpen(hWndMain);
if (hw==hButCreateMap) OnClickButCreateMap(hWndMain);
if (hw==hButOpenMap) OnClickButCreateMap(hWndMain);
if (hw==hButCloseMap) OnClickCloseMap(hWndMain);
}
Теперь насчёт повторной отправки сообщения..в случае неудачного исхода...
Объясните пожалуйста, как это организовать? Повторять действия, предусмотренные в случае нажатия на кнопку ButCreateMap?
И в какой момент нужно об этом позаботиться?