Condividi tramite


User32.dll o Kernel32.dll non inizializza

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 o CreateProcessAsUser, 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 useranno Winsta0\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