Avatar billede mikkelbm Nybegynder
13. august 2007 - 16:43 Der er 9 kommentarer og
1 løsning

AccessViolationException i kald til native dll

Hejsa,

Jeg sidder med et problem jeg bare ikke kan kringle. Vilkårligt får jeg nemlig smidt en acces-violation i hovedet når jeg prøver at tilgå en native dll.

Dll'en har følgende:

static char          acAboutString[]  = "TallyKey Mifare reader driver (DLL). Version: 2.3  " __DATE__ ", " __TIME__;

Og metoden jeg kalder er:

extern "C"
{
  __declspec( dllexport ) LPSTR GetAboutString( void )
  {
    vDebugPrintf( "GetAboutString(Addr=%X): %s", acAboutString, acAboutString );
    return( acAboutString );
  }

  //... flere metoder
}


Min C# kode er som følger:

[DllImport("TallyKeyMifareReader.dll", EntryPoint = "_GetAboutString")]
public static extern string _GetAboutString();


Og som sagt får jeg exception på vilkårlige tidspunkter - jeg har ikke fundet en sikker måde at genskabe det på, men hvis jeg prøver nok gange dukker den op.

Det underlige er, at metodekaldet til debug-print bliver udskrevet i debug-view, og derefter får jeg smidt den omtalte exception i hovedet.
Avatar billede cms Nybegynder
13. august 2007 - 17:35 #1
Hvis man forestiller sig, at det er caller som skal rydde din string op (jeg kan ikke lige huske reglerne) så vil du få et problem, idet den managede kode vil forsøge at free'e din statiske streng - og dermed skabe vilkårlige fejl.
Jeg vil tro, du skal lave en ny streng ud fra den statiske streng, og returnere denne kopi i stedet.
Avatar billede mikkelbm Nybegynder
13. august 2007 - 19:30 #2
Jeg forstår bare ikke, hvis det er det der er problemet - for fejlen kommer selvom det første jeg kalder er den metode.

Altså:

main()
{
  string info = _GetAboutString();
}

medfører sommetider en accessviolation.
Avatar billede arne_v Ekspert
14. august 2007 - 04:08 #3
Koden virker upåklageligt hos mig.

XP 32 bit
.NET 2.0
VC++ 8.00

Du bruger ikke tilfældigvis en 64 bit ?
Avatar billede mikkelbm Nybegynder
14. august 2007 - 07:52 #4
Nej, det gør jeg nu ikke. Det skal dog siges, at det ikke er mig der compiler C koden. Det bliver compilet med Borlands compiler.

Jeg har selv forsøgt med samme konfiguration:

XP 32 bit
.NET 2.0
VC++ 8.00

Og der kan jeg ikke fremprovokere fejlen. Men gør jeg det op mod den assembly jeg får fra min kollega, får jeg med jævne mellemrum den omtalte exception - selvom C/CPP-koden er den samme.
Avatar billede mikkelbm Nybegynder
14. august 2007 - 07:54 #5
>> "selvom C/CPP-koden er den samme."
Den kode jeg har posted her er den samme - det er selvfølgelig en del af et større projekt, og derfor kan jeg heller ikke bare konvertere hele projektet og compile selv.
Avatar billede arne_v Ekspert
15. august 2007 - 01:14 #6
Jeg kan heller ikke genskabe problemet med BCB 5.6 !

Hvilke compiler options bruges der når I oversætter med Borland ?
Avatar billede mikkelbm Nybegynder
24. august 2007 - 09:51 #7
Umiddelbart ser det ud til at vi har fået det til at virke. Vi kører nu med wide-strings i stedet for, og hvis jeg fortæller mit eksterne kald, at den skal forvente en widestring ser det ud til at virke. Vi har i hvert fald ikke fået fejlen siden.

Smid et svar for jeres forsøg.

(Beklager den lange svartid)
Avatar billede arne_v Ekspert
25. august 2007 - 01:45 #8
.
Avatar billede mikkelbm Nybegynder
27. august 2007 - 23:41 #9
.
Avatar billede mikkelbm Nybegynder
27. august 2007 - 23:42 #10
Hmm... Gad vide hvorfor der kom et "svar" fra mig, da jeg accepterede svaret...
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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