Gå til innhold

C++ Managed (mixed mode) feiler med 0xc0000005


Anbefalte innlegg

Hei alle eksperter

Jeg har en C++ DLL som er kompillert i moxed mode slik at jeg kan kalle .net komponenter. På min maskin så fungerer dette helt ypperlig og glimrende. Når jeg kjører dette på en windows 2008 R2 server så går dette også helt greit. en hvis jeg tar programmet til Windows XP eller Windows Server 2003 så feiiler det med meldingen om initiaalisering feiler og kode 0xc0000005. Jeg har googlet dette opp og ned i mente og har vel således funnet at dette er en Access Violation error. Jeg har også funnet en artikkel på MSDN som omhandler noe av det samme, men finner liksom ingen artikkel som gir meg noe fornuftig svar.. Jeg gjetter jo på at det er en eller annen DLL som kansje ikke stemmer i versjon eller noe slikt. Trenger sårt litt hjelp her og dere c++ kodere kan sikkert dette på fingerspissen

 

For ordensskyld, dette c++ laget mitt er et standard c++ prosjekt der jeg har slått på støtte for mixed mode. tror det heter /CLR (sitter på toget i skrivende stund så jeg får ikke sjekket) Denne C++ DLL'en kaller jeg opp fra et program skrevet i Clarion for Windows, som er å se på som et hvilket som helst annet win32 program, med full støtte for API. C++ DLLen er kompillert inn med en eksporert prosedyre slik at jeg får tak i den fra Clarion. Denne prosedyren returnerer et interface fra C++ som jeg benytter i Clarion. Som sagt så går dette kjempefint altså så et er ikke der problemet ligger, men i det jeg kjører dette fra terminal server 2003.

 

 

Setter umåtelig stor pris på alle bidrag her...

Lenke til kommentar
Videoannonse
Annonse

Bare en tilleggs opplysning:

Hvis jeg stripper vekk C++ og Clarion biten i prosjektet og lager en egen C# EXE som bruker klassene mine så fungerer det helt knirkefritt altså... Også på terminal serveren... Det må jo være et bevis på at Framework er intallert.

Endret av HDSoftware
Lenke til kommentar

Én ting som slår meg, er at Windows 2008 R2 er kun å få i 64-bit, og 64-bit er normen i Windows 7, men Windows XP og 2003 er det ingen selvfølge er 64-bit.

 

Jeg anbefaler at du legger inn virtuelle testmaskiner (VirtualBox er å anbefale) og tester mer grundig. Legg også inn debugger på testsystemene dine, da er det mye enklere å se hva som kræsjer.

Endret av GeirGrusom
Lenke til kommentar

Tror neppe det virker. Som nevnt så fungerer dette aldeles glimrende med et rent .NET program på disse maskinene. Det er når jeg kaller MixedMode C++ DLL fra Clarion at dette feiler. Tror neppe jeg får kjørt den Debuggeren du snakker om sammen med et Clarion program. Måtte eventuellt ha laget en EXE i C da som drar opp denne mixed mode DLL'en, men da må jkeg studere en hel drøss. Aner ikke engang hvor jeg skal begynne på noe sånt...

Lenke til kommentar

nei, men som jeg har sagt tidligere, det er ikke feil i koden min. Feilen er lastingen av programmet. Det må være en eller anne mangel. Jeg har nå droppet InterOP tankegangen og kompillert en C# exe fil som tar imot parametere. Håpløst dårlig workaround egentlig, men det funker til akkurat dette formålet. Men jeg MÅ finne en løsning fordi heg har flere oppgaver som skal løses der utveksling av data må gå begge veier. Har gjort det tidligere ved å ha en parameter tabell på SQL serveren, men URK URK URK!!!

Lenke til kommentar

Access Violation er en typisk "peker er satt til null feil"

En ting jeg glemte i forbifarten er at du kan debugge DLL-er i Visual Studio som ikke nødvendigvis blir startet av et .NET program. Sjekk Debugging siden i konfigurasjonen.

 

Det er ikke produktivt å skylde på tredjeparts-API-er eller det underliggende systemet. 999 av 1000 ganger er det utvikleren selv som gjør det feil, men det er alltid fristende å skylde på .NET eller Microsoft, men det fungerer som regel i den enden. Jeg har vært borti én feil i .NET gjennom tida jeg har jobbet med det (var en feil i ListBox kontrollen), og det løste jeg ved å gjøre det på en annen, mer egnet måte.

Lenke til kommentar

Jeg skylder ikke på noe API fordi det ikke er feil på noe API.

Jeg skylder heller ikke på .NET for dette er C++, selv om det er managed altså.

Jeg VET at .NET fungerer på terminal serveren fordi jeg, etter å ta vekk C++ DLL'en, har fått dette til å virke helt fabelaktig, men det er en kjip workaround.

Jeg VET også at dette ikke har med null pekere å gjøre fordi, som jeg har nevnt tidligere, det ikke er kode feil i programmet som forårsaker feilen.

 

Når en EXE fil lastes inn i minnet så utfører OS en masse oppgaver som f.eks. det å sette av minne og laste andre DLL'er i minnet. Når f.eks. en DLL ikke eksisterer så vil det normalt komme en feil melding fra OS'et om den manglende DLL. I dette tilfellet så mangler det ingen DLL fordi dette kjører 100% på alle våre PC'er. Når vi kopierer hele produksjonsmappa over på en Windows 2003 server så feiler det.

 

La meg si det slik: Hvis jeg i et test program laget i clarion legger inn som absolutt og første og eneste kodelinje:

 

Message('Her er jeg')

 

 

Så feiler programmet før message vises. Det må da være et bevis godt nok på at det ikke er bøggs i koden min... Eventuellt så kunne jeg trodd det om det var noe problemer med noen statiske klasser, men da ville jo feilen ha dukket opp på alle maskiner.

Lenke til kommentar

Access Violation er at du prøver og lese eller skrive til en ugyldig peker (null peker, eller peker til et objekt som er frigjort), eller gir ugyldige verdier til biblioteksfunksjoner. Hvis det er din managed C++/CLI kode som feiler, så burde du bruke Visual Studio for å se hvor det er.

Forøvrig kompilerer C++/CLI til ren .NET CLR kode.

 

Du kan debugge DLL-en ved å få Visual Studio til å starte klientprogrammet gjennom Properties til prosjektet, "Configuration Properties->Debugging"

Du kan også velge remote debugging der dersom du ikke vil installere hele Visual studio på maskinen.

Lenke til kommentar

hehe, igjen, det er altså ikek noe kode som feiler. Det er nemlig ikke noe kode som kjører når den meldingen dukker opp. Jeg tror jeg har sagt dette sikkert 3 ganger nå ;-)

 

Jeg tror jeg gir opp denne tråden. Blir for vanskelig å kommunisere problemet. Lever med EXE løsningen inntill videre så får helelr kunder som bruker Win7 og WIn2008 få den ordentlige løsningen som virker og XP og win2k3 får bruke workaround modellen så lenge..

Lenke til kommentar

Her er et typisk tilfelle av Access Violation, index out of bounds:

 

int* ptr = new int[100];
ptr[99] = 500; // OK
ptr[100] = 1000; // Access violation, det er bare 100 elementer i arrayet
delete[] ptr;
int val = ptr[99]; // Access violation, arrayet er slettet

 

Kanskje det hjelper litt?

 

Eventuelt kan du bruke Dependency Walker for å sjekke at alle DLL-er er i samme versjoner, uten at jeg har noen stor tro på at det er dette som er problemet, men det er ikke umulig.

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...