Russian Qt Forum

Qt => Вопросы новичков => Тема начата: libertas от Март 16, 2014, 19:59



Название: Доступ дочернего процесса к file mapping родительского процесса.
Отправлено: libertas от Март 16, 2014, 19:59
Здравствуйте,
подскажите, пожалуйста, как правильно в дочернем процессе отобразить на память содержимое файла открытого в родительском процессе.

Мой код в родительском процессе:

Код:
HANDLE hfilemap;
HANDLE hfile;
char* pMap;
hfile = CreateFile(L"My.txt",
                              GENERIC_READ | GENERIC_WRITE,
                              FILE_SHARE_READ | FILE_SHARE_WRITE,
                              0,
                              OPEN_ALWAYS,
                              FILE_ATTRIBUTE_NORMAL,
                              0);
hfilemap = CreateFileMapping(hfile,
                                            0,
                                            PAGE_READWRITE,
                                            0,
                                            256,
                                            L"MyFileMapping");
pMap = static_cast<char*>(MapViewOfFile(hfilemap,
                                       FILE_MAP_ALL_ACCESS,
                                       0,
                                       0,
                                       0));

Затем я запускаю дочерний процесс как
Код:
 STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    wchar_t name[] = L"..\\HelloWorld\\debug\\HelloWorld.exe";
    WINBOOL wChild = CreateProcess(0,
                                  name,
                                  0,
                                  0,
                                  FALSE,
                                  0,
                                  0,
                                  0,
                                  &si,
                                  &pi);

В дочернем процессе нужно использовать функцию OpenFileMapping или нужно делать по-другому?

Спасибо.


Название: Re: Доступ дочернего процесса к file mapping родительского процесса.
Отправлено: Hrundel от Март 17, 2014, 03:15
Во первых, тема далеко не для новичков. Во вторых, не имеет ни какого отношения к Qt форуму. WinAPI здесь в прямую не обсуждается. *(Qt для того и создан, чтобы WinAPI с MFC мочкануть :P  ;D  ;D  ;D)
Найдутся, конечно, хорошие люди и ответят - но как-то не совсем в тему это.


Название: Re: Доступ дочернего процесса к file mapping родительского процесса.
Отправлено: xokc от Март 17, 2014, 08:58
Информации же бездна на эту тему.
У меня вот так работает в "дочернем" процессе:

Код
C++ (Qt)
bool SharedIndexReader::open(const char *name)
{
   mapFile = OpenFileMapping(
       FILE_MAP_READ,          // Read access
       FALSE,                  // Do not inherit the name
       name                    // File mapping name
   );
   if (!mapFile) return false;
 
   size = (index *)MapViewOfFile(
       mapFile,                // Handle of the map object
       FILE_MAP_READ,          // Read access
       0,                      // High-order DWORD of the file offset
       0,                      // Low-order DWORD of the file offset
       sizeof(*size)           // The number of bytes to map to view
   );
 
   return (size != nullptr);
}
А вообще, если нужен всё же Qt, то там есть QSharedMemory для всего этого - отлично работает.


Название: Re: Доступ дочернего процесса к file mapping родительского процесса.
Отправлено: libertas от Март 17, 2014, 13:35
Спасибо, я так и думал делать через именованый объект. Только я возврашаю char*. А в примере index*. Я так понимаю, это зависит от того с чем удобней потом работать?


Название: Re: Доступ дочернего процесса к file mapping родительского процесса.
Отправлено: libertas от Март 17, 2014, 13:36
Во первых, тема далеко не для новичков. Во вторых, не имеет ни какого отношения к Qt форуму. WinAPI здесь в прямую не обсуждается. *(Qt для того и создан, чтобы WinAPI с MFC мочкануть :P  ;D  ;D  ;D)
Найдутся, конечно, хорошие люди и ответят - но как-то не совсем в тему это.

Согласен, промахнулся я с темой=) Извиняюсь=)