02. december 1999 - 15:34Der er
2 kommentarer og 1 løsning
Hvad er egentligt meningen med 'Safcall'
Jeg sidder og bøvler lidt med noget Automation og Excel. I den forbindelse er dokumentation en by i Rusland... Et af de bedste steder at søge informationer er i Excel97 type libraryet. Her har jeg dog lagt mærke til at stort set alle funktioner og procedurer ender med ordet 'SafeCall'. Fx. som i følgende linie (under TextEffectFormat, som jeg benytter) Function Get_Text: WideString; safecall;
Hvad er meningen med Safecall her? On-line hjælpen siger noget om implemantation af COM error handling, men berører det mig?
Det du spørger om har egentligt meget lidt at gøre med Automation, men helt masse med Distribueret programering (DCOM) at gøre. Prøv at forestille dig følgende situation: Du har lavet et program, der eksekverer en metode, der kører på en server et eller andet sted. Fx. sidder du hjemme og er via nettet forbundet til dit arbejde, hvor du arbejder med nogle data, der fremskaffes via en application server. I den forbindelse kaldes din Get_Text metode.
Glem så i første omgang at funktionen er erklæret med Safecall, men bare er en alm. metode. I såfald kunne den tænkes at være implementeret som:
Function Get_Text: WideString; Begin Result := FooBar; End;
Fint nok, men hvad sker der hvis kaldet til FooBar resulterer i en fejl (Exception)? Der vil ske det, at der vil blive oprettet en dialogbox, hvor du skal kvittere for at fortsætte. Fint nok, bortset fra at da funktionen rent faktisk kører (eksekveres) på application-serveren, så er det altså på serveren din dialogbox fremkommer og du er derfor nødt til at traske ind på arbejde, lukke dig ind i servere rummet og..... - det er lidt uholdbart!
Hvad gør du så? Du kan implementere din funktion som:
Funktion Get_Text(Out Text : WideString) : HResult; Begin Try Result := S_OK; Text := FooBar; Except Result := E_SomeErrorCode; // Fx: E_UNEXPECTED End; End;
Som du nu kan se, så er fejlen (exceptionen) opsnappet og dit program kan kan trygt kalde serverfunktionen - Et Safe Call. HResult er defineret som en Integer (mener jeg) i en eller anden standard unit (System?).
Det compileren gør er faktisk at wrappe din metode i en Try-Exception-End blok og hvis noget går galt så undertrykkes exceptionen og fejlen returneres i en HResult. Du kan derfor skrive/implementere dine server rutiner som om det ikke kan gå galt - ligesom i det første eksempel.
Desuden er der noget fimmel med hvorledes parametre overføres og data rives af stakken - men du skal nu være temmeligt langt nede i coden for at bekymre dig om.
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.