2016-03-22 2 views
1

Я пытаюсь поделиться некоторыми данными между двумя процессами. Первый записывает данные в сопоставленный файл, а второй читает его.Именованная общая память Windows api C++

Вот мой код до сих пор:

Первый процесс:

#include "stdafx.h" 
    #include <Windows.h> 
    #include <tlhelp32.h> 
    #include <tchar.h> 
    #include<stdio.h> 

    #define BUF_SIZE 256 

    int _tmain(int argc, _TCHAR* argv[]) { 
    TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
    LPTSTR szMsg = TEXT("MESS"); 

    HANDLE tokenH; 
    TOKEN_PRIVILEGES tp; 
    LUID luid; 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenH)) { 
     printf("OpenProcessToken error: %u\n", GetLastError()); 
     return FALSE; 
    } 
    if (!LookupPrivilegeValue(NULL, SE_CREATE_GLOBAL_NAME, &luid)) { 
     printf("LookupPrivilegeValue error: %u\n", GetLastError()); 
     return FALSE; 
    } 
    tp.PrivilegeCount = 1; 
    tp.Privileges[0].Luid = luid; 
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    if (!AdjustTokenPrivileges(tokenH, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { 
     printf("AdjustTokenPrivileges error: %u\n", GetLastError()); 
     return FALSE; 
    } 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) 
    { 
     printf("The token does not have the specified privilege. \n"); 
     return FALSE; 
    } 
    CloseHandle(tokenH); 

    HANDLE hMapFile; 
    LPCTSTR pBuf; 
    hMapFile = CreateFileMapping(
     INVALID_HANDLE_VALUE, 
     NULL,      
     PAGE_READWRITE,   
     0,      
     BUF_SIZE,     
     szName); 
    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not create file mapping object (%d).\n"), 
     GetLastError()); 
     return 1; 
    } 
    pBuf = (LPTSTR)MapViewOfFile(hMapFile, 
     FILE_MAP_ALL_ACCESS, 
     0, 
     0, 
     BUF_SIZE); 

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
     GetLastError()); 

     CloseHandle(hMapFile); 

     return 1; 
    } 
    CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
    UnmapViewOfFile(pBuf); 
    printf("Done\n"); 
    CloseHandle(hMapFile); 
    return 0; 
} 

Второй процесс:

#include "stdafx.h" 
#include <Windows.h> 
#include <tlhelp32.h> 
#include <tchar.h> 
#include <stdio.h> 
#pragma comment(lib, "user32.lib") 

#define BUF_SIZE 256 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
    HANDLE tokenH; 
    TOKEN_PRIVILEGES tp; 
    LUID luid; 
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenH); 
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) { 
     printf("LookupPrivilegeValue error: %u\n", GetLastError()); 
     return FALSE; 
    } 
    tp.PrivilegeCount = 1; 
    tp.Privileges[0].Luid = luid; 
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    if (!AdjustTokenPrivileges(tokenH, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { 
     printf("AdjustTokenPrivileges error: %u\n", GetLastError()); 
     return FALSE; 
    } 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) 
    { 
     printf("The token does not have the specified privilege. \n"); 
     return FALSE; 
    } 
    CloseHandle(tokenH); 

    HANDLE hMapFile; 
    LPCTSTR pBuf; 
    hMapFile = OpenFileMapping(
     FILE_MAP_ALL_ACCESS, // read/write access 
     FALSE,     // do not inherit the name 
     szName);    // name of mapping object 

    if (hMapFile == NULL) 
    { 
     _tprintf(TEXT("Could not open file mapping object (%d).\n"), 
      GetLastError()); 
     return 1; 
    } 
    pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
     FILE_MAP_ALL_ACCESS, // read/write permission 
     0, 
     0, 
     BUF_SIZE); 

    if (pBuf == NULL) 
    { 
     _tprintf(TEXT("Could not map view of file (%d).\n"), 
      GetLastError()); 
     CloseHandle(hMapFile); 
     return 1; 
    } 
    MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); 
    UnmapViewOfFile(pBuf); 
    CloseHandle(hMapFile); 
    return 0; 
} 

Первый процесс удается записывать свои данные (я не получаю никакой ошибки сообщение и получить сообщение «Готово»), но проблема связана со вторым процессом. После «OpenFileMapping», я получаю от getLastError код 2, который для несуществующего файла. Я запускаю оба процесса как администратор.

ответ

2

Ошибка 2 - ERROR_FILE_NOT_FOUND, что означает, что именованный объект сопоставления не существует в то время, когда вызывается OpenFileMapping().

Чтобы совместно использовать именованный объект ядра между процессами, оба процесса должны выполняться одновременно с . Как и другие именованные объекты ядра (события, мьютексы и т. Д.), Объект сопоставления имеет связанный с ним счетчик ссылок, где каждый открытый дескриптор увеличивает счетчик ссылок. После закрытия всех дескрипторов объект уничтожается.

Итак, когда первое приложение отменяет его представление и закрывает его дескриптор объекту сопоставления, объект будет уничтожен, если второе приложение еще не имеет собственного дескриптора, открытого для одного и того же объекта сопоставления. Таким образом, объект не будет существовать, когда второе приложение попытается его открыть.

+0

Теперь, когда я думаю об этом, это имеет смысл. Но у меня вопрос новичков: как я могу предотвратить остановку первой программы? –

+0

Очевидно, что вам нужно закодировать что-то в первом приложении, на которое он может ждать, будь то цикл, который проверяет, чтобы условие стало истинным, или спящее ожидание на сигнале или что-то в этом роде. Если вы хотите, чтобы первое приложение ожидало, пока второе приложение не будет использовать хранимое значение, одним из вариантов было бы создание именованного объекта события через 'CreateEvent()' и ждать его через 'WaitForSingleObject()', тогда второе приложение может открыть событие через 'OpenEvent()' и передать его через 'SetEvent()'. –

+0

Просто интересно - так в Windows вы не можете создать «персидскую» общую память - с которой в любой момент можно было бы подключить и отключить какой-либо процесс? – SergeyA

Смежные вопросы