18. september 2010 - 12:26Der er
13 kommentarer og 1 løsning
Databaser i BPL'er ...
Hej,
Jeg har et projekt, som kræver brug af BPL-enheder.
Skabelsen, kald og lukning af samme form (samt returnering af relevante variabel-værdier fra denne BPL-form) volder INGEN problemer, det kører bare...
MEN:
I samme øjeblik jeg lægger en TDataSource på formen vil det ikke køre. Koden er korrekt, og kompilationen er også vellykket, men kald af BPL-modul fra hovedmodul giver en fejl.
(Har prøvet forskellige VISUELLE komponenter inkl. TListView (som er ret kompliceret- så vidt jeg ved !)(alle kompilerer og virker fint), mens DataBase-komponenter (TDataSource, TDatagrid mv.) kompilerer fint, men giver fejl ved afprøvning.
Har set lidt på Database-komponenternes dcp-lister og det virker som om disse også inkluderes i BPL-projektet, alligevel går det galt ved RUN-time.
Og har prøvet at klikke i RUNTIME only og (DESIGN and RUNTIME) i BPL-kreator FORMEN ( PACKAGE-...) - samme problem ... (damn).
Kan nogen klogere i BPL-skabelser give mig et TIP MED EN VOGNSTANG om hvad der er galt (læs: hvad gør jeg galt)...
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Kan du komme med lidt fejlbeskrivelse? Kører du med autocreate på formene (det er en dum praksis undtagen ved TDataModuler) eller opretter du efter behov?
Har du dine db-bpl liggende samme sted som din exe, når du kører runtime package, så kan du der hvor du sætter dit hak, også lave en liste med det bpl som IKKE bliver linket med i din exe, og som derfor skal være tilstede sammen med din exe.
Kommer ud med en ACCESS VIOLATION AT ADDRESS xxxxxxx IN MODULE TESTPACKP.exe Read of Address yyyyyyy.
*TestpackP er navnet på min exe-fil. *
Svar til MARTINBLIND: Jeg går ind i PACKAGE-boksen ( File / new/ OPTHER / PACKAGE - faneblad DESCRIPTION ) og krydser af ved RUNTIME and DESIGNTIME (har prøvet DESIGNTIME alene - ingen forskel) og EXPLICIT REBUILD er også 'hakket' ....
Glemte at sige, at i OPTIONS / Directories / Conditionals sætter jeg stierne til mit bibliotek. (eks: e:\delphi7\TEST\TESTPACK\ -- hvor alle kildekoder ligger . )
øhhh.... hvis du ikke har klikket på compile with runtimepackedes så er bpl filer ikke aktuelle.
prøv at søg info omkring hvad man gør med db i en dll, en bpl er samme princip, og afhængig af hvilken db du bruger kan der være nogle ting, evt. skal du bruge sharemem :-)
Det der undrer mig såre, er at NÆSTEN uanset hvilken anden VISUEL komponent jeg sætter ind på BPL-formen, så virker det. Har prøvet at sætte FIL-OPEN DIALOG og FIL-SAVE-DIALOG (som danner kode), men ikke direkte synlige "beviser" på formen. Jeg kompilerer med de eksisterene opsætninger i PACKAGE-boksen, og eksekverer herefter min testenbde EXE og de fungerer helt perfekt.
Jegt ved ikke hvorfor specielt disse komponenter volder besvær. Uden at lægge hovedet på blokken (dum ide, ja, man ku' næsten sige det var halsløs gerning !) mener jeg at kunne erindre at nogle dababasekomponenter er (mere eller mindre) camouflerede <D>-COM servere, men som sagt - jeg erindrer det ikke præcist. Kan du korrigere mig her ?
Men jeg har en klar fornemmelse at det ikke er der fejlen primært er. Jeg har prøvet at sætte EEN TDataSource (DB) på BPL-formen (KUN DEN ALENE), kompilere og køre MASTER-exe'n, som giver fejl (den tidligere nævnte). Jeg sætter ingen parametre på samme TDataSource overhovedet. Kompileringen synes at gå godt, men det er fra kaldet fra hovedhoved-rutinen i 'master-exen' fejlen opstår.
Ser sådan ud:
phm := LoadPackage(ExtractFilePath(ParamStr(0)) + 'TestPack1.bpl'); if phm <> 0 then try @ExecFunct := GetProcAddress(phm,'Execute'); if Assigned(ExecFunct) then begin // if ExecFunct('Tekst 1','Tekst 2','Tekst 3') = True then if ExecFunct(Tlist, 'Tekst 1','Tekst 2','Tekst 3') = True then ShowMessage('True!') else ShowMessage('False!'); end else begin ShowMessage ('Execute routine not found!'); end {if assigned} finally UnloadPackage(phm); end {try / finally} else {if hpm<>0} ShowMessage ('Package not found');
og den fungerer.
Har søgt på nettet efter en forklaring på hvorfor det ikke virker, men har ikke fundet nogen endnu. Jeg ved der er noget med strenge (max. 256 tegn / som ved DLL'ere ) men det er ikke aktuelt her.
der er også noget med nogle db'er, bla. havde BDE'en nogle ting man skulle. Du kan prøve at søge efter en artikel fra delphi-magazine der handlene om at køre med packages som man loader manuelt som du gør, faktisk en ret interessant en af slagsen, mener det var nr. 30-40 stykker, et sommer nr så vit jeg husker, der var i hvertfald nogle "guldkorn" om bpl'er
Er du sikker på dit datamodul bliver oprettet (test med et ShowMessage(self.ClassName) i dens OnCreate)? Det er jo en slags skjult form. Enten skal den oprettes (og slettes) i main-formen eller den skal smides sammen mainformen i DPR-filen (men jeg har aldrig selv kørt med runtimepakker).
I øvrigt burde SharedMem ikke være nødvendig i runtimepakker. Er det ikke bl.a. derfor man lavede pakkerne som et alternativ til DLL?
Nu er det pseudokode for ellers var der nok en syntaksfejl eller to...
Det giver fornuft for Mainformen kender ikke den objektinstans som din BPL-form har oprettet. Jeg plejer at slette de globale variable som automatisk oprettes med formene (undtaget er dog mainformens) men her er det måske smart at bruge den på datamodulet, ligesom jeg har gjort det her i mit program (i DPR-filen):
Application.Initialize;
DM := TDM.Create(Application); if not DM.Initialize then exit;
Jeg skulle snakke med en "real-hardcore programmør" på jobbet i hovedkontoret i anden sammenhæng sent i går eftermiddag. Efter at have forklaret problemstillingen for ham (han er hard-C++-ore mand, ikke Delphi) lovede han, at han ville tænke lidt over det.
Han ringede så her i formiddags, stillede nogle uddybende spøærgsmål (fy fa-bian (længe leve Pippi Langstrømpe..) - de var langhårede ) og tænkte så lidt igen.
Det bedste han kunne foreslå var at det hele laves som en COM /DCOM /MIdas (CDM) løsning, fordi du i en single- /fler-layered CDM løsning kan inkludere de moduler (ad hoc) som du (læs programmet) måtte have brug for. (altså en "slags DLL med mulighed for yderligere indlæsning af DLL'ere) ...
(AK ja på den gamle SPERRY-UNIVAC kunne vi i assembler programmering sætte en bit så kunne vi indexere indexeringen, som kunne indexere indexeringen ...... --->> ) Men det er historie så det batter...
Så det klogeste jeg kan gøre nu er at hive lærebogen i COM/DCOM ned fra den støvede hylde, pudse læsebrillerne, starte kaffemaskinen med ÆGTE JAVA i realtime og blive MEEEEEEGEEET klogere.. Så det vil jeg.
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.