Avatar billede egemar Nybegynder
02. december 1999 - 15:34 Der 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?

Egemar.
Avatar billede delphi Nybegynder
02. december 1999 - 16:18 #1
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.

NiP/Delphi
Avatar billede hlj Nybegynder
02. december 1999 - 21:28 #2
Tak for en informativ forklaring
Avatar billede delphi Nybegynder
03. december 1999 - 08:42 #3
Det var så lidt ;)

NiP
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