Domanda

Vorrei implementare IPC utilizzando Named Memoria condivisa.

Per fare questo, uno dei passaggi è sempre un handle a un Mappatura della memoria degli oggetti , con CreateFileMapping ().

Lo faccio esattamente come sito Web MSDN reccommends: http://msdn.microsoft.com/en-us/library/aa366551 (v = VS.85) aspx :

hFileMappingHandle = CreateFileMapping
    (
        INVALID_HANDLE_VALUE,      // use paging file
        NULL,                      // default security 
        PAGE_READWRITE,            // read/write access
        0,            // maximum object size (high-order DWORD) 
        256,            // maximum object size (low-order DWORD)  
        "Global\\MyFileMappingObject"          // name of mapping object
    ); 
DWORD dwError = GetLastError();

Tuttavia, l'handle restituito è sempre 0x0 , e l'errore di Sistema Codice restituito è: 0x5 (. Accesso negato)

  • Solo nome Memory Sharing desiderato (non la condivisione di file).
  • Windows 7 x64 bit OS
  • diritti utente dell'amministratore disponibili
  • ha sviluppato l'applicazione: 64bit applicazione plug-in (. Dll)

Qualcuno ha la stessa esperienza, e un modo per risolvere il problema, per favore? Io uso sito MSDN come il mio riferimento, quindi di non pensare, non v'è problema nel codice.

È stato utile?

Soluzione

Sembra che tu non dispongono di privilegi sufficienti.

Da MSDN:

La creazione di un oggetto di mapping file nel namespace globale da una sessione di altri di sessione a zero richiede la SeCreateGlobalPrivilege privilegio. Per ulteriori informazioni, vedere Kernel Object Gli spazi dei nomi.

...

La creazione di un oggetto file-mapping nel namespace globale, utilizzando CreateFileMapping, da una sessione diverso da zero è una sessione un'operazione privilegiata. A causa di ciò, Esecuzione di un'applicazione in modo arbitrario Remote Host Desktop Session (RD sessione host) server di sessione deve avere SeCreateGlobalPrivilege abilitato Per creare un oggetto file-mapping nel namespace globale con successo. Il controllo privilegio si limita alla creazione di file di mapping di oggetti, e non si applica ai apertura esistente quelli. Ad esempio, se un servizio o la sistema crea un oggetto file-mapping, qualsiasi processo in esecuzione in qualsiasi lattina sessione di accesso che oggetto file-mapping a condizione che l'utente ha la accesso necessario.

Altri suggerimenti

Amministratori, Servizi e servizi di rete hanno SeCreateGlobalPrivilege per impostazione predefinita. È necessario ricordare però, che Windows7 / Vista non funziona tutto come amministratore. Così utilizzare "Start come amministratore" per rendere "Global \" lavoro per l'applicazione. Se stai debug, avviare Visual Studio come amministratore anche.

Per creare mappature globale del file è necessario il privilegio SeCreateGlobalPrivilege - avete che? Accesso negato implica che questo è un problema di autorizzazioni, di sicuro.

Il riferimento ai servizi di terminale nella documentazione su namespace globale è un po 'fuorviante in quanto implica avete solo bisogno di preoccuparsi di questo se si dispone di una situazione insolita.

In realtà entrambi i servizi di IIS e di sistema eseguiti in seduta pari a zero, e il primo / unico utente per l'accesso viene eseguito in sessione 1 -. Quindi bisogna usare namespace globale per la comunicazione tra IIS o un servizio e un programma normale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top