Problem ved release/lukning af tovejs-COM...
Com-problem.*BESKRIVELSEN*
Jeg har en applikation, Project1.
Den har en form, der hedder FFirst.
Når man trykker på en knap på FFirst kalder programmet sig selv, med en parameter, fx ShellExecute(0, nil, pchar(paramstr(0)),
\'/second\', nil, sw_showdefault);
I Project1.dpr tjekker den om der er en parameter, der hedder \'/second\' - hvis den er der creater den formen FSecond, hvis den ikke er
der åbner den formen FFirst
Dette virker fint. Altså jeg har nu to forskellige processer, samme exefil, to forskellige vinduer og to ikoner/knapper på taskbaren.
Lige som jeg vil have det.
Jeg har nu tilføjet to COM-objekter til Project1, sådan at disse vinduer kan snakke sammen run-time. Kaldene til ComServer (oprettelsen
af de to servere) har jeg flyttet fra objekt-unitet til Project1.dpr, så den kun opretter second-serveren, hvis second-parametren er
sat, og omvendt.
Jeg har så tilføjet nogle methods/procedures til de to objekter, og har lavet kald til CoObjekt1.Create osv.
Dernæst har jeg tilføjet nogle knapper til hver af de to forms. Når man nu trykker på den ene knap i den ene form, vises der en besked i
den anden form. Også dette virker.
*ØNSKET*
Det er nu meningen, at hvis man lukker FFirst skal den \'fortælle\' FSecond at den også skal lukke. Men hvis man lukker FSecond, skal
FFirst forblive åben.
Bare det første er svært nok - det sidste er jo faktisk let. Så lad os koncentrere os om det i første omgang...
*HAR GJORT*
I FFirst.FormClose kalder jeg en method/procedure i FSecond\'s com-objekt, der hedder Close. Denne proc gør sådan her:
<<
TComObject(Objekt1).ObjRelease;
>>
- hvor Objekt1 er deklareret som IObjekt1 og tidligere er initialiseret som Objekt1 := CoObjekt1.Create;
Dernæst kalder den FSecond.Close
*PROBLEMET
Når man gør som beskrevet ovenfor kommer der en fejl om at der muligvis stadig er aktive com-clienter der har koblet sig til
FSecond-processen. Og det er jo rigtigt nok. For vi (jeg) har jo glemt at kalde TComObject(Objekt2).ObjRelease i FFirst.FormClose.
Så skulle man tro, at alt var godt. Først kalder FormClose FSecond\'s luk-metode og så releaser den sit forhold til FSecond\'s objekt, til
sidst lukker den sig selv.
Men hvordan får jeg den til ikke at overlappe? Altså så jeg kan lukke FSecond uden at få meddelelsen??
*NB*
Nu har programmet i virkeligheden tusindvis af programlinjer, men jeg har simplificeret det ovenfor for læsbarheden.
Jeg er en nybegynder til COM-programmering, så jeg har garanteret sagt en masse vås - men jeg håber da I forstår.
Med venlig hilsen & på forhånd tak,
Christian Scheuer - cnt@cnt.dk
