IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Межпроцессное взаимодействие с помощью страничного файла, VC++ 2008 EE
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Здравствуйте!
Мне требуется реализовать обмен текстовыми сообщениями между несколькими процессами. Обеспечить возможность отправки сообщения сразу нескольким адресатам. Реализовать подтверждение приёма сообщения адресатом или, в случае потери сообщения, повторную его передачу. Взаимодействие выполнить с помощью страничного файла.

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

Сначала хочу получить список активных процессов, вывести, скажем, на ListBox и выбрать процессы, которые будут приёмниками текстовых сообщений (а как можно в ListBox осуществить множестсвенный выбор? если вообще можно).
Далее можно из моего приложения открыть файл.
Теперь в процессе-передатчике создаём в памяти проекцию открытого дискового файла и отображаем её на адресное пространство процесса-отправителя с помощью CreateFileMapping(), где будем использовать дескриптор открытого файла...
Процессы же приёмники (выбранные в ListBox) по нажатию кнопки должны отобразить проекцию страничного файла на своё адресное пространство и прочитать данные, которые подлежат передаче...а как это осуществить? мне на понятно...И как это осуществить с учётом того, что получателей должно быть несколько??
И как я понимаю, процесс-приёмник не должен начинать читать из памяти данные раньше, чем их туда запишет отправитель...А как это должно выглядеть? (использовать объекты синхронизации?)
И последнее...В каком виде можно организовать подтверждение приёма сообщений, при чём чтоб было понятно, от какого процесса-приёмника пришло это подтверждение??

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Тебе сначала сюда: ближе к концу страницы есть тема "Совместный доступ процессов к данным через механизм проецирования"...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


По ссылке из предыдущего поста имеется программа-пример 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);
}
}


Знаком "?" отмечено неясное...Что это за операция? Как её заменить с учётом того, что у меня на форме есть Edit, куда вводится сообщение для передачи..?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Что это за операция?
Это макрос: MSDN -> Edit_GetText Macro

Цитата
Как её заменить с учётом того, что у меня на форме есть Edit, куда вводится сообщение для передачи..?
Не надо ничего менять, макрос сам развернется в вызов GetWindowText...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


при компиляции возникла вот такая ошибка:

1>d:\program files\microsoft sdks\windows\v6.0a\include\shtypes.h(51) : error C2144: syntax error : 'int' should be preceded by ';'

что это означает?? и откуда shtypes.h? я даже не использую этот заголовочный файл..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Без понятия... Я открыл CPP-файл в Builder-е, он прекрасно все скомпилировал. Что-то опять у VC не то в библиотеках. Попробуй не открывать тот проект, а создать новый, и добавить в него только CPP-файл.

Цитата
я даже не использую этот заголовочный файл..
То, что ты его не подключаешь явно - не значит "не используешь", он может подключаться другими header-файлами. Кстати, встречались жалобы, что совместное использование shtypes.h и shlobj.h приводит к конфликту. Возможно, конфликт проявляется не только с shlobj.h, но и с другими файлами заголовков...

Кстати, у тебя же Unicode-проект подразумевается? Тогда посмотри в файл CmnHdr.h, там есть указание:

#ifndef _M_IX86
#define UNICODE
#endif

// Чтобы компилировать с использованием Unicode на x86 CPU, раскомментируйте
// строку ниже
// #define UNICODE

Ты раскомментировала эту строку?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 28.11.2008 13:13) *

Попробуй не открывать тот проект, а создать новый, и добавить в него только CPP-файл.

У меня уже в новом проекте..
Кстати, насчёт
1>d:\program files\microsoft sdks\windows\v6.0a\include\shtypes.h(51) : error C2144: syntax error : 'int' should be preceded by ';'...

Компилятор при обнаружении ошибки указывает на строки из shtypes.h вот такого содержания:

/* Forward Declarations */

/* header files for imported files */
#include "wtypes.h"

#ifdef __cplusplus
extern "C"{ //<----
#endif




Цитата(volvo @ 28.11.2008 13:13) *

Кстати, у тебя же Unicode-проект подразумевается? Тогда посмотри в файл CmnHdr.h, там есть указание:

У меня вообще нет такого файла...Поиск не дал результатов..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
У меня вообще нет такого файла
В таком случае, как ты компилируешь проект MMFShare? Он требует подключения файла CmnHdr.h... А если ты просто надергала куски из MMFShare и вставила в свою программу, то я ничем тебе помочь не могу, я не телепат. Приаттачивай свой CPP полностью.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 28.11.2008 13:39) *

... А если ты просто надергала куски из MMFShare и вставила в свою программу....

так оно и есть....

Сообщение отредактировано: 18192123 -


Прикрепленные файлы
Прикрепленный файл  Main.cpp ( 9.3 килобайт ) Кол-во скачиваний: 167
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Все прекрасно компилируется и GCC и Builder-ом 2009, если после подключения Windows.h подключить еще и WindowsX.h (ну, и естественно, добавить недостающие прототипы, которые у тебя в main.h). Выходит, что-то у тебя в настройках самого проекта напортачено.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Добавила действия по нахождению объекта «проекция файла" с именем 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);





Прикрепленные файлы
Прикрепленный файл  Main.cpp ( 10.68 килобайт ) Кол-во скачиваний: 150
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






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);
}
blink.gif

А почему и по hButCreateMap и по hButOpenMap вызывается процедуры создания файла? Во втором случае должно выполняться нечто другое по-моему...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 28.11.2008 23:31) *

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);
}
blink.gif

А почему и по hButCreateMap и по hButOpenMap вызывается процедуры создания файла? Во втором случае должно выполняться нечто другое по-моему...

Оййй...Не изменила название процедуры....Какая же глупая ошибка...!!!
Спасибо, что указали на неё!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Теперь насчёт повторной отправки сообщения..в случае неудачного исхода...
Объясните пожалуйста, как это организовать? Повторять действия, предусмотренные в случае нажатия на кнопку ButCreateMap?
И в какой момент нужно об этом позаботиться?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Цитата
Теперь насчёт повторной отправки сообщения..в случае неудачного исхода...
А что, если в первый раз отсылка была неудачной, то повторная посылка окажется успешной? Ну, вызовешь ты еще раз OnClickButCreateMap, и что? Если у тебя (к примеру) не было прав доступа в папку, так их и не будет. Если не было места на диске, оно из ниоткуда не появится.

Надо смотреть, в чем причина отказа в посылке сообщения, и убирать причину, а не просто повторять попытку, которая обречена на провал. GetLastError после возврата признака неудачного выполнения какой-то функции, и принятие мер по решению проблемы, указанной в коде ошибки - единственное, что могу предложить...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 9:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name