2016-03-22 18 views
1

Ich versuche, einige Daten zwischen zwei Prozessen zu teilen. Der erste schreibt die Daten in die zugeordnete Datei und der zweite liest sie.Benannte Shared Memory Windows API C++

Hier ist mein Code so weit:

Erster Prozess:

#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; 
} 

Zweiter Prozess:

#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; 
} 

Der erste Prozess verwaltet seine Daten zu schreiben (ich erhalte keine Fehler Nachricht und erhalten Sie die "Fertig" -Nachricht, aber das Problem ist mit dem zweiten Prozess. Nach "OpenFileMapping" bekomme ich von getLastError den Code 2, der für nicht existierende Datei ist. Ich führe beide Prozesse als Administrator aus.

Antwort

2

Fehler 2 ist ERROR_FILE_NOT_FOUND, welches das Named Mapping-Objekt bedeutet nicht zu dem Zeitpunkt existieren OpenFileMapping() genannt wird.

Um ein benanntes Kernel-Objekt zwischen Prozessen zu teilen, müssen beide Prozesse unter gleichzeitig ausgeführt werden. Wie bei anderen benannten Kernel-Objekten (Ereignisse, Mutexe usw.) ist ein Mapping-Objekt mit einem Verweiszähler verknüpft, wobei jeder geöffnete Anfasser den Verweiszähler inkrementiert. Nachdem alle Ziehpunkte geschlossen wurden, wird das Objekt zerstört.

Wenn also die erste Anwendung ihre Ansicht ausblendet und ihren Handle zum Mapping-Objekt schließt, wird das Objekt zerstört, wenn die zweite App nicht bereits über ein eigenes Handle für dasselbe Mapping-Objekt verfügt. Daher wird das Objekt nicht existieren, wenn die zweite App es öffnet.

+0

Jetzt, da ich darüber nachdenke, macht es Sinn. Aber ich habe eine neue Frage: Wie verhindere ich, dass das erste Programm aufhört? –

+0

Natürlich müssen Sie etwas in die erste App, auf die es warten kann, codieren, sei es eine Schleife, die nach einer Bedingung sucht, um wahr zu werden, oder eine schlafende Wartezeit auf ein Signal, oder etwas Ähnliches. Wenn die erste App warten soll, bis die zweite Anwendung den gespeicherten Wert verwendet, besteht eine Option darin, über 'CreateEvent()' 'ein benanntes Ereignisobjekt zu erstellen und über' WaitForSingleObject() 'darauf zu warten. Dann kann die zweite Anwendung geöffnet werden das Ereignis über 'OpenEvent()' und signalisieren Sie es über 'SetEvent()'. –

+0

Nur wundernd - so unter Windows können Sie nicht wirklich einen "persited" Shared Memory erstellen - die jederzeit mit jedem Prozess verbunden und von ihm getrennt werden könnte? – SergeyA