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.
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. –
@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. –
Questo ha senso. Vedrò un po 'più da solo, ma sono felice di segnarlo come risposta. Grazie. –