08. april 2003 - 15:27Der er
8 kommentarer og 1 løsning
Pointer igennem et COM interrface
Hejsa
Jeg har et program med et COM interface. Igennem dette com interface vil jeg gerne give en pointer. Jeg har være inde under Valid types i online hjælpen, men kan ikke finde en pointer. Er der en der kan fortælle mig hvilken type jeg vælger?
En pointer er kun valid inde i dit eget program. Andre programmer kan ikke bruge pointeren til noget. Så spørgsmålet er, hvad vil du egentlig med den pointer?
Jeg har en model. For hvert tidsskridt er der således beregnet værdier som jeg gerne vil kunne tilgå udefra. Min implementering indtil videre indeholder en binær søgning på det rigtige element ud fra id for derefter at returnere en double. Jeg har haft stor succes med fra en dll at returnere en pointer til den beregnede double, hvilket er den hurtigste måde at gøre dette på hvis det er en "in process" dll. Problemet er bare når det så bliver en out of process COM server, idet at slå op hver gang og returnere en double i mit tilfælde her er omtrent 50 gange langsommere. Derfor ville jeg teste muligheden for at kunne referere direkte til doublen i hukommelsen. Hvis der er andre muligheder for at løse mit problem hører jeg gerne det. Giver det jeg skriver her mening?
Justin Case
P.S tolderlund, du står p.t. nummer 1 til pointene, men jeg vil gerrne have lidt mere diskussion om mit problem.
Jeg tror nok det giver mening det du skriver. Er det du vil at sender din pointer fra COM serveren til din klient? Hvor klienten så senere sender samme pointer tilbage til COM serveren for at få en double returneret? Så er det ikke noget problem, idet COM serveren godt kan bruge sine "egen" pointer. Du skal blot ikke brugue den til noget i din klient, andet end at opbevare den og sende den til COM serveren senere. Du skal bare være sikker på at den pointer som COM serveren modtager senere stadig er valid, dvs. peger på noget der findes stadigvæk i COM serveren. For at sende en pointer kan du simpelthen caste den til en integer. Det vil virke da en pointer og en integer begge fylder 4 bytes. Du gør sådan: MyInteger := Integer(MyPointer); Og omvendt: MyPointer := Pointer(MyInteger);
Hvis det er en double klienten i realiteten skal bruge, så giv dog klienten en double. Det da nemmere at klienten spørger udfra id og serveren søger beregningsstrukturerne igennem for at finde den double der svarer til det ønskede id, og returnerer så den pågældende double. Det er da mere simpelt på den måde. Der er ingen grund til at serveren returnerer en pointer som klienten skal typecaste bagefter. Serveren kan ligeså godt returnere en double med det samme.
Jeg tror ikke, at problemet ligger så meget i at det er gennem COM, men derimod at det er imellem to applikationer der ikke deler adresseområde. Spørgsmålet er så, om det er muligt at "oversætte" pointeren til en "global pointer" inden den sendes igennem COM interfacet. Hvis du har flere kommentarerr vil jeg meget gerne høre dem, men du får pointene alligevel. Tak
COM bevirker netop at klienten og serveren kører i hver sin process. Og pointere er kun valide indenfor den samme process. Det du kan gøre i stedet for er at bruge memory mapped files. Det muligør at lave et hukommelsesområde som begge programmer kan benytte. Om det så er hurtigere ved jeg ikke, men du kan jo prøve.
Synes godt om
Ny brugerNybegynder
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.