08. april 2002 - 10:26Der er
10 kommentarer og 1 løsning
Crash af funktion
Jeg kalder en procedure, hvor i der et sted, er et funktionskald. Funktionskaldet er noget avanceret og jeg ved ikke om det helt virker endnu. Problemet er at proceduren (et on klik event) crasher når den bliver kaldt. Fejlen meldes at være i mit funktionskald. Ok der kan være en fejl. Men fejlen kommer med det samme at procedure bliver kaldt, dvs. koden før funktionen bliver ikke udført. Sættes en Msgbox("1") lige før funktionskaldet sker der ingenting, boxen kommer ikke med 1. Hvorfor crasher proceduren allerede når den bliver kaldt, når eksekveringen ikke en gang er kommet ned til det funktionskald der meldes fejl i???
Der bruges en SDK, der kan kværne højdedata. Men hvis det er deklarationen er det ikke så godt, da den jo følger med SDK'en. Funktion ligger gemt i en dll fil, så jeg har kun deklarationen fra en manual.
Koden er nok lidt intetsignende :-)
Declare Function vmInterVisibilityStdCall Lib "vmApi.dll" (ByVal GridID As Long, ByVal pszResultsMIF As String, _ ByVal pszLineMIF As String, pdFromX As Double, pdFromY As Double, pdFromZAdjust As Double, pdToX As Double, _ pdToY As Double, pdToZAdjust As Double, pdEarthCurvature As Double, ByVal pszZUnitDescription As String, _ pdwReceiverVisible As Long, pdObstructionHeight As Double, pdToAdjustment As Double, _ pdFromAdjustment As Double, pdwNumberofSamples As Long, pstPointtoPointData As CROSS_SECTION_POINT) _ As Long
Typer er defineret som Type CROSS_SECTION_POINT Dist As Double Elevation As Double ViewableElevation As Double RelativeElevation As Double RelativeViewableElevation As Double End Type
Men kender nogen en disassembler der kan aflæse hvilke parameter der er på en funktion i en dll. Kender PE-explore, men den kan kun levere funktionerne uden deres paramenter.
Hmmmm - VB melder om fejl i dit funktionskald, men udfører ikke de linier der ligger umiddelbart forinden dit funktionskald?? Meget mystisk!
Det mest oplagte er vel at enten bliver din Msgbox "1" aldrig bliver kaldt pga. en eller anden betinget sætning forinden, eller også bliver din funktion kaldt fra et andet sted, og det er der fejlen opstår.
Prøv at sætte nogle breakpoints ind lige før/efter dit procedurekald, så kan du se hvor langt den når inden den crasher.
(Breakpoint = tryk F9 i den/de linie(r) du vil breake ved i kodevinduet. Men kikker jeg på din funktion, kan jeg se, at du ikke er ny i VB, og derfor sikkert allerede har overvejet mine forslag ;o)
Ingen betinget sætning inden funktionskaldet og funktionen bliver kun kaldt et sted fra... Med breakpoint og en anden procedurer, har jeg identificeret crashet til lige præcist der hvor min procedure kaldes fra en anden procedurer. Der bliver således ikke eksekveret noget kode overhovedet i proceduren med det korrupte funktionskald. - Som sagt meget mystisk...
Ja, så kan jeg ikke komme længere end at give dig ret - hvorfor den msgbox ikke vises, lyder yderst mærkværdigt. Spændt på at høre hvad forklaringen er (hvis den findes??) Held og lykke, Martin
Som nolle k foreslår, er det højst sandsynligt erklæringen det er galt med. Når du kører (debugger) et prog i VB-miljøet, så laves der en "mini"-kompilering, og her tjekker VB ALLE procedurer og funktioner igennem for logiske fejl inden der køres. Jeg formoder at du HAR tjekket for korrekt format på alle de variable, du indsætter i funktionen? Jeg synes arrTPointtoPointData() ser lidt underlig ud. Er det et array? For type CROSS_SECTION_POINT er jo IKKE et array. (indeholder kun Doubler).
Du kunne prøve at lave en wrapper-funktion, der kalder API'en, og så kalde denne wrapper i sub'en. Det vil sandsynligvis tillade dig at eksekvere koden frem til wrapper kaldet.
-Jeg kan desværre ikke hjælpe med en disassembler. Jeg har også ofte savnet sådan en.
Er kommet til at jeg får runtime fejlen: 'Byref argument type mismatch' Debuggeren melder fejl i arrTPointtoPointData arrayet. Arrayet er en simpel type, der er en dimensioneringen af arrayet der hedder: Dim arrTPointtoPointData(100) As CROSS_SECTION_POINT af typen: Type CROSS_SECTION_POINT Dist As Double Elevation As Double ViewableElevation As Double RelativeElevation As Double RelativeViewableElevation As Double End Type Typen er defineret i en bas fil som en general deklaration. Det burde vel være nok. Kender nogen noget omkring: 'Byref argument type mismatch', arrayet er jo deklareret byref.
Jeg tror stadig at det er arrayet der skaber problemerne. Prøv følgende der hvor du kalder funktionen: Lad os antage du vil kalde den med arrTPointtoPointData(25):
Dim TPtPD as CROSS_SECTION_POINT TPtPD = arrTPointtoPointData(25) l = vmInterVisibilityStdCall(.........,TPtPD)
tjacob >> OK, det hjalp :-) Funktionen funker nu. Jeg havde glemt at putte indexet med i arrayet. Troede funktionen var klar over det, da den er ByRef deklaret. Det sjove er nu bare at programmet crasher, når det kommer til End Sub i den procedure hvor funktionen findes, funktionen returnere dog det den skal. Men det er en anden historie. Takker.
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.