Запуск дочерних процессов. Простейшие способы взаимодействия (обмена данными), страница 5

signals:

void CopyData(const QString & data);

};

3.  реализация

bool ChildWindow::winEvent ( MSG * message, long * result )

{

if( message->message == WM_COPYDATA )

{

        // Если сообщение WM_COPYDATA, то в lParam сообщения – указатель на 
        //структуру COPYDATASTRUCT

COPYDATASTRUCT * data = (COPYDATASTRUCT *) message->lParam;

        //Инициируем посылку сигнала

emit CopyData(QString((char*)data->lpData));

// для того, чтобы механизм событий Qt не обрабатывал это сообщение дальше

*result = 0;

return true;

}

// все остальные события предлагаем обработать механизму событий Qt

return false;

}

4.  В режиме дизайнера создать label. При этом в класс Ui::ChildWindow добавляется QLabel *label;

Чтобы при получении сигнала CopyData полученный текст выводился в надпись (Text Label). Для соединения сигнала  void CopyData(const QString & data); и акссесора void QLabel::setText ( const QString & ) можно использовать дизайнер, но мы сделаем это вручную:

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

connect(this, SIGNAL(CopyData(QString)), ui->label, SLOT(setText(QString)));

}

1)   

4. Отображение файлов на память

Последовательность действий:

HANDLE hFile = CreateFile(…);

HANDLE hFileMap = CreateFileMapping (hFile, …);

PVOID p = MapViewOfFile(hFileMap…);

//используем p

UnmapViewOfFile(p);

CloseHandle(hFile);

CloseHandle(hFileMap);

Подсказка: процессу-получателю необходимо каким-то образом сообщить о том, что он может работать с общими данными. В принципе всегда возможны два варианта синхронизации: с помощью синхронизирующих объектов (это мы еще не проходили) и посредством обмена сообщениями (а это мы уже проходили).

Прототипы Win32-функций:

HANDLE CreateFile(//подробное описание смотри выше

LPCTSTR     lpFileName,

DWORD dwAccess,   // GENERIC_WRITE - при проекциях в память не используется

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreation,

DWORD dwFlagsAndAttributes,

HANDLE      hTemplateFile);

HANDLE CreateFileMapping(

HANDLE      hFile,      //дескриптор, возвращенный CreateFile() или 0xFFFFFFFF. В первом случае сервис отобразит заданный файл в память, во втором создаст блок памяти для совместного использования разными процессами.

LPSECURITY_ATTRIBUTES   lpAttributes,     //указатель на структуру SECURITY_ATTRIBUTES, для установок по умолчанию в большинстве случаев - NULL

DWORD flProtect,  //атрибуты защиты страниц. Должны быть согласованы с правами доступа в CreateFile() PAGE_READONLY – после отображения можно считывать данные из файла (но нельзя записывать или исполнять). При этом в CreateFile() – GENERIC_READ PAGE_READWRITE – полный доступ, то есть после отображения можно и читать и писать. При этом в CreateFile() – GENERIC_READ | GENERIC_WRITE PAGE_WRITECOPY - после отображения можно и читать и писать. При этом при изменении содержимого отображенной памяти собственная (для данного процесса) копия записывается в файл подкачки, а не непосредственно в исходный файл (при записи будет создана закрытая копия страницы), а в CreateFile() – GENERIC_READ | GENERIC_WRITE

DWORD dwMaimumSizeHigh, // Основное назначение сервиса – убедиться, что для объекта «проекция файла» доступен нужный объем физической памяти => старшая часть 64-разрядного размера файла (для небольших файлов - 0)

DWORD dwMaimumSizeLow,  // младшая… Замечание: если оба параметра равны 0, используется текущий размер, но размер файла изменяться не будет! Если ожидается, что размер файла может увеличиться, используйте ожидаемый размер (тогда при необходимости будет использован нужный размер файла). Не «пишите» в область файла за указанной границей!!! – объект отображения не может «расти»