windows - Skal en out-proc COM-server til sidst stoppe i alle tilfælde, bliver den ikke brugt?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg fandt en ud-COM-COM-server implementeret (angiveligt på grund af en fejl) på en sådan måde, at hvis en klient kalder CoGetClassObject() og derefter aldrig forsøger at instantiere noget med den hentede fabrik, kører serverprocessen for evigt. COM-serveren er ikke startet som en tjeneste, det er en almindelig eksekverbar.


I det beskrevne scenarie kalder klienten aldrig IClassFactory::LockServer(), så dette spørgsmål er fuldstændig at ignorere disse 'serverlåse'.


Er den rigtige adfærd? Skulle en ud-COM-server altid stoppe, når den ikke har betjent objekter i et tidsrum, eller skal der være tilfælde, hvor en ud-COM-server skal køre kontinuerligt, selvom den ikke tjener nogen objekter?

Bedste reference


Ud af proces servere og IClassFactory :: LockServer () [3]



  COM tilføjer et implicit kald til LockServer med TRUE til klasseobjektet, når det marscherer IClassFactory-grænsefladen og et implicit kald til LockServer med FALSE, når klienten frigiver IClassFactory-grænsefladen. Derfor er det ikke nødvendigt at fjerne LockServer-opkald tilbage til serveren, og proxy for LockServer returnerer simpelthen S\_OK uden at fjerne fjernbetjeningen.



Processen skal løbe, indtil klassen objektet er udgivet som (rå) COM ikke giver mulighed for nogen form for time-out-mekanisme. Så ja, indtil du -> Release () class object-objektets interface, du har erhvervet med CoGetClassObject () , vil serverprocessen (hosted dll eller exe) fortsætte med at køre. Opførelsen har intet at gøre med de klasser, der er oprettet af klasseobjektet (fabrikken), da de refereres separat.


FWIW, Den hentede interface skal heller ikke være IClassFactory. Det kan være en slags brugerdefineret implementering, så du kan gøre ting uden for de kendte grænseflader, COM giver. Jeg finder det underligt, at CoGetClassObject bliver kaldt i stedet for CoCreateInstance ( Ex), som at kalde CoGetClassObject () er virkelig et specialværktøj til oprettelse af flere objekter. Jeg har aldrig fundet mig selv ved at bruge klasseobjektet, eller monikere eller et dusin andre adfærd, som COM understøttede. DCOM, COM +, OLE, sikker men ikke de lave råvarer.

Andre referencer 1


Jeg synes, at programmet er rigtigt. CoGetClassObject returnerer en AddRef ed grænseflade, og hvis det ikke er 'Release' d, bør EXE ikke afslutte.