Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive un problema a causa del quale un'applicazione eseguita da CreateProcess
o CreateProcessAsUser
potrebbe non riuscire.
Si applica a: Microsoft Windows
Numero KB originale: 184802
Sintomi
Un'applicazione eseguita da CreateProcess
o CreateProcessAsUser
potrebbe non riuscire e viene visualizzato uno dei messaggi di errore seguenti:
L'inizializzazione della libreria dinamica <sistema>\system32\user32.dll non è riuscita. Il processo termina in modo anomalo. L'inizializzazione della libreria dinamica <sistema>\system32\kernel32.dll non è riuscita. Il processo termina in modo anomalo.
Inoltre, il processo non riuscito restituisce il codice di uscita 128 o il codice seguente:
error:ERROR_WAIT_NO_CHILDREN
Motivo
Questo errore si verifica per uno dei motivi seguenti:
Il processo eseguito non dispone del corretto accesso alla stazione finestra e al desktop associati al processo.
Il sistema ha esaurito l'heap desktop.
Maggiori informazioni
Causa 1
Il processo eseguito non dispone del corretto accesso alla stazione finestra e al desktop associati al processo.
Il membro lpDesktop della struttura STARTUPINFO passato ai
CreateProcess
oCreateProcessAsUser
, specifica la stazione della finestra e il desktop associati al processo eseguito. Il processo eseguito deve disporre dell'accesso alla sicurezza corretto alla stazione di finestre e al desktop specificato.Causa 2
Il sistema ha esaurito l'heap desktop.
A ciascun oggetto desktop nel sistema è associato un heap desktop. L'oggetto desktop usa l'heap per archiviare menu, hook, stringhe e finestre. In Windows Server 2003 e Windows XP a 32 bit, il sistema alloca l'heap desktop da un buffer di 48 megabyte (MB) a livello di sistema. Oltre agli heap desktop, anche i driver della stampante e i driver dei tipi di carattere usano questo buffer.
I desktop sono associati alle stazioni finestra. Una stazione finestra può contenere zero o più desktop. È possibile modificare le dimensioni dell'heap desktop allocato per un desktop associato a una stazione finestra modificando il valore del Registro di sistema seguente.
Annotazioni
Non raccomandiamo di usare l'opzione /3GB. L'interruttore /3GB viene specificato nel file Boot.ini. L'opzione /3GB è supportata solo per i sistemi operativi a 32 bit.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
In Windows Server 2003 e Windows XP a 32 bit, i dati predefiniti per questo valore del Registro di sistema saranno simili ai seguenti (tutti su una riga):
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows
SharedSection=1024,3072,512 Windows=On SubSystemType=Windows
ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3
ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off
MaxRequestThreads=16
In versioni diverse di Windows, i dati predefiniti per questo valore del Registro di sistema saranno simili ai seguenti:
Per Windows Vista RTM (32 bit)
SharedSection=1024,3072,512
Per Windows Vista SP1, Windows 7, Windows 8, Windows 8.1 (32 bit) e Windows Server 2008 (32 bit)
SharedSection=1024,12288,512
Per Windows Vista, Windows 7, Windows 8, Windows 8.1 (64 bit), Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 e Windows Server 2012 R2 (64 bit)
SharedSection=1024,20480,768
I valori numerici che seguono SharedSection=
controllano la modalità di allocazione dell'heap desktop. Questi SharedSection
valori vengono specificati in kilobyte. Esistono impostazioni separate per i desktop collegate alle stazioni finestra interattive e non interattive.
Annotazioni
Se si modificano i SharedSection
valori nel Registro di sistema, è necessario riavviare il sistema per rendere effettive le modifiche.
Importante
Questa sezione, metodo o attività contiene passaggi che ti spiegano come modificare il registro. Tuttavia, potrebbero verificarsi gravi problemi se si modifica il registro in modo errato. Pertanto, assicurati che segui questi passaggi con attenzione. Per una maggiore protezione, esegui un backup del registro prima di modificarlo. Quindi, è possibile ripristinare il registro se si verifica un problema. Per ulteriori informazioni su come eseguire il backup e ripristinare il registro, consulta Come eseguire il backup e ripristinare il registro in Windows.
Il primo SharedSection
valore (1024) è la dimensione dell'heap condivisa comune a tutti i desktop. Ciò comprende la tabella handle globale. Questa tabella contiene handle per finestre, menu, icone, cursori e così via e impostazioni di sistema condivise. È improbabile che sia necessario modificare questo valore.
Il secondo SharedSection
valore è la dimensione dell'heap desktop per ogni desktop associato alla stazione finestra interattiva WinSta0. Gli oggetti utente, ad esempio hook, menu, stringhe e finestre, utilizzano memoria in questo heap desktop. È improbabile che sia necessario modificare questo valore.
Ogni desktop creato nella stazione interattiva della finestra usa l'heap desktop predefinito di 3.072 KB. Per impostazione predefinita, il sistema crea i tre desktop seguenti in Winsta0:
Winlogon
Impostazione predefinita
Il desktop dell'applicazione predefinito verrà usato da tutti i processi per i quali
Winsta0\default
è specificato nel membro della struttura STARTUPINFO.lpDesktop. Quando il membro della struttura lpDesktop è NULL, la stazione di finestra e il desktop vengono ereditati dal processo padre. Tutti i servizi che vengono eseguiti nell'account LocalSystem con l'opzione di avvio "Consenti al servizio di interagire con il desktop" selezionata userannoWinsta0\Default
. Tutti questi processi condivideranno l'heap desktop associato al desktop dell'applicazione predefinito.Salvaschermo
Il desktop dello screen saver viene creato nella stazione interattiva della finestra (WinSta0) quando viene visualizzato uno screen saver.
Il terzo valore SharedSection è la dimensione dell'heap desktop per ogni desktop associato a una stazione finestra non interattiva. Se questo valore non è presente, le dimensioni dell'heap desktop per le stazioni finestra non interattive saranno uguali alle dimensioni specificate per le stazioni finestra interattive, ovvero il secondo valore SharedSection.
Se sono presenti solo due valori SharedSection, è possibile aggiungere un terzo valore per specificare le dimensioni dell'heap desktop per i desktop creati in stazioni finestra non interattive.
Ogni processo di servizio eseguito con un account utente riceverà un nuovo desktop in una stazione finestra non interattiva creata da Service Control Manager (SCM). Di conseguenza, ogni servizio eseguito con un account utente utilizzerà il numero di kilobyte di heap desktop specificato nel terzo valore SharedSection. Tutti i servizi che vengono eseguiti con l'account LocalSystem quando l'opzione Consenti al servizio di interagire con il desktop non è selezionata condividono l'heap del desktop predefinito nella stazione delle finestre del servizio non interattivo (Service-0x0-3e7$).
L'heap desktop totale utilizzato nelle stazioni finestra interattive e non interattive deve rientrare nel buffer.
La riduzione del secondo o terzo valore SharedSection aumenterà il numero di desktop che possono essere creati nelle stazioni finestra corrispondenti. I valori più piccoli limitano il numero di hook, menu, stringhe e finestre che possono essere creati in un desktop. D'altra parte, l'aumento del secondo o terzo valore SharedSection ridurrà il numero di desktop che è possibile creare. Tuttavia, questo aumenterà anche il numero di hook, menu, stringhe e finestre che possono essere create in un desktop.
Poiché SCM crea un nuovo desktop nella stazione finestra non interattiva per ogni processo di servizio in esecuzione con un account utente, un terzo valore SharedSection più grande ridurrà il numero di servizi dell'account utente che possono essere eseguiti correttamente nel sistema. Il valore minimo che può essere specificato per il secondo o terzo valore SharedSection è 128. Qualsiasi tentativo di usare un valore più piccolo userà invece 128.
L'heap desktop viene allocato da User32.dll quando un processo richiede oggetti utente. Se un'applicazione non dipende da User32.dll, non utilizzerà l'heap desktop.
Annotazioni
In Windows Server 2003, l'evento specifico viene registrato nel registro di sistema quando una delle condizioni seguenti è vera:
Se l'heap desktop diventa pieno, viene registrato l'evento seguente:
Event Type: Warning Event Source: Win32k Event Category: None Event ID: 243 Date: Date Time: Time User: N/A Computer: ServerName Description: A desktop heap allocation failed.
In questo caso, aumentare le dimensioni del desktop heap.
Se l'heap del desktop totale diventa la dimensione del buffer a livello di sistema, viene registrato l'evento seguente:
Event Type: Warning Event Source: Win32k Event Category: None Event ID: 244 Date: Date Time: Time User: N/A Computer: ServerName Description: Failed to create a desktop due to desktop heap exhaustion.
In questo caso, riduci la dimensione dell'heap del desktop.
In Windows Server 2003, un buffer a livello di sistema è 20 MB quando si verifica una delle condizioni seguenti:
- Si è in un ambiente Servizi terminal.
- L'interruttore /3GB viene specificato nel file Boot.ini.
Si applica a:
- Microsoft Windows XP Professional
- Microsoft Windows XP Home Edition
- Windows Vista Ultimate
- Windows Vista Enterprise
- Windows Vista Business
- Windows Vista Home Premium
- Windows 7 Ultimate
- Windows 7 Enterprise
- Windows 7 Professional
- Windows 7 Home Premium
- Windows 8 Enterprise
- Windows 8 Pro, Windows 8
- Windows 8.1 Enterprise
- Windows 8.1 Pro
- Windows 8.1
- Microsoft Windows Server 2003 Datacenter Edition (x86 a 32-bit)
- Microsoft Windows Server 2003 Datacenter x64 Edition
- Microsoft Windows Server 2003 edizione Enterprise (x86 a 32 bit)
- Microsoft Windows Server 2003 Enterprise x64 Edition
- Microsoft Windows Server 2003 edizione Standard (x86 a 32 bit)
- Microsoft Windows Server 2003 Standard x64 Edition
- Windows Server 2008 Datacenter
- Windows Server 2008 Enterprise
- Windows Server 2008 R2 Datacenter
- Windows Server 2008 R2 Enterprise
- Windows Server 2008 Standard
- Windows Server 2012 Datacenter
- Windows Server 2012 Standard
- Windows Server 2012 R2 Datacenter
- Windows Server 2012 R2 Standard