Avatar billede cms Nybegynder
31. juli 2001 - 22:52 Der er 2 kommentarer og
1 løsning

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
Avatar billede cms Nybegynder
31. juli 2001 - 22:53 #1
Forbandede notepad der ombryder linjerne ! :-)
Avatar billede cms Nybegynder
01. august 2001 - 10:51 #2
Altså jeg kunne jo i FFirst.FormClose gøre sådan at jeg først releaser objektet, og dernæst sender en wm_user-message til FSecond om at lukke...
Men så ryger lidt af idéen med at bruge com, right?
Avatar billede cms Nybegynder
01. august 2001 - 11:04 #3
Glem det. Jeg tilføjede kald til Close i eventen Comserver.OnLastRelease, og så release\'de jeg simpelthen bare objekterne - så klarede den det hele selv :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester