2011-02-24 4 views
5

Ho un server COM LocalServer32 EXE è iniziato quando una chiamata applicazione client c_com_ptr :: CreateInstance (usando wrapper ATL.)L'attivazione COM di EXE LocalServer32 dallo stesso account utente condivide un processo esistente o no?

In Windows 7, quando una seconda applicazione client in esecuzione con lo stesso account utente chiama anche c_com_ptr :: CreateInstance , una seconda copia dell'EXE viene avviata in esecuzione con lo stesso account utente. Avevo l'impressione, da una vita passata, che il secondo client condividesse il primo EXE.

Il processo LocalServer32 è condiviso o no? Quando o quando no? Googling per una risposta mi dà un enorme rapporto segnale/rumore e non riesco a trovare la risposta.

La chiave del Registro di sistema CLSID ha il valore LocalServer32 che fornisce il percorso EXE, ProgID, Programmable (stringa vuota), TypeLib (GUID) e VersionIndependentProgId. Ho una chiave AppID.

I do non desidera eseguire l'EXE come un servizio e non mi interessa che il processo non sia condiviso. Voglio solo conoscere le regole, quindi so cosa aspettarmi (su Windows Server 2003 in poi.)

MODIFICA: seguendo la risposta di Chris 'di seguito, ho esaminato la chiamata CoRegisterClassObject nel mio server. Sto usando ATL e ho scavalcato MyServer :: RegisterClassObjects per collegarmi alla catena chiamante a CAtlExeModuleT :: RegisterClassObjects e vedere che ATL sta usando CLSCTX_LOCAL_SERVER e REGCLS_MULTIPLEUSE.

La modifica di questo in CLSCTX_LOCAL_SERVER e REGCLS_SINGLEUSE provoca l'avvio di più processi, in base al numero di oggetti COM creati dal client, come previsto.

Ancora, tornando a REGCLS_MULTIPLEUSE, ottengo un processo COM server per processo client COM, ogni processo server che contiene tutti gli oggetti COM per il proprio client, come previsto, tranne che se due client COM sono in esecuzione con lo stesso utente account, ognuno ha il proprio server che non è come ho capito REGCLS_MULTIPLEUSE.

La differenza potrebbe essere che i client stessi sono in realtà servizi di Windows? (Lo sono.) Quando un processo di servizio di Windows in esecuzione come account utente crea un oggetto COM in REGCLS_MULTIPLEUSE, viene trattato diversamente, causando il comportamento osservato? Perché sto ricevendo più di un processo? (E tanto per chiarire, io faccio non voglio che il mio server COM per l'esecuzione come un servizio di Windows, ma i clienti che lo utilizzano fare run come servizi di Windows.)

Inoltre, eseguendo i clienti sia come sistema locale o Servizio di rete, REGCLS_MULTIPLEUSE funziona come mi sarei aspettato: viene avviato solo un singolo processo EXE del server COM. I processi multipli vengono avviati quando i client COM sono servizi Windows in esecuzione con account utente.

risposta

7

Il routing delle richieste di attivazione fuori processo è controllato dalla registrazione di oggetti di classe con Gestione controllo servizi COM. Se SCM ha un oggetto di classe registrato utilizzabile, verrà utilizzato per soddisfare la richiesta. In caso contrario, avvierà un'istanza di processo exe del server COM per ottenerne uno.Sia molteplici richieste di attivazione vengono indirizzati a un singolo processo exe server COM dipende quindi dai seguenti fattori, almeno (non sono sicuro se questo è un elenco completo):

  • le bandiere di attivazione specificato dal server COM quando richiama CoRegisterClassObject per la registrazione con SCM può far sì che future richieste di attivazione determinino l'avvio di una nuova istanza di processo exe, il caso più semplice e comune è l'uso del flag REGCLS_SINGLEUSE, che consente l'utilizzo dell'oggetto di classe registrato per una singola attivazione solo.
  • In base al modo in cui la classe è registrata, le richieste di attivazione da diversi contesti di sicurezza possono essere gestite da diverse istanze di server COM (a quanto pare non si applica allo scenario poiché le applicazioni client vengono eseguite negli stessi contesti di sicurezza).
+0

La tua risposta mi ha portato a indagare sui parametri di CoRegisterClassObject ma ancora non capisco il comportamento osservato - Sto usando REGCLS_MULTIPLEUSE. Vedi le mie modifiche nella mia domanda sopra. –

+0

@Jim: Ora sono al limite delle mie conoscenze, ma ho la sensazione che le tabelle degli oggetti di classe gestite da COM SCM siano esaminate dalla sessione di accesso e che SCM riutilizzi solo un oggetto di classe all'interno della stessa sessione. Se i client sono tutti i servizi in esecuzione in sessioni separate, ottengono la propria istanza di oggetto di classe (e quindi il proprio processo server) anche con REGCLS_MULTIPLEUSE e anche se in esecuzione con la stessa identità di account. Un'ipotesi che potresti testare, comunque. –

+0

Questo ha senso. Vedrò un po 'più da solo, ma sono felice di segnarlo come risposta. Grazie. –

Problemi correlati