Avatar billede shemeri Praktikant
07. oktober 2010 - 13:08 Der er 13 kommentarer og
1 løsning

Marshal.FreeCoTaskMem

Hej

Jeg har lavet en lille program som printer ud til BONPrinter men hver gang jeg kalder:

Marshal.FreeCoTaskMem(Buff);

Så crasher programmet i Windows 7 og kun 64bit?? Den virker fint i x32 versioner af vista, xp og windows 7

Nogen kan hjælpe :)
Avatar billede cdull Nybegynder
07. oktober 2010 - 13:24 #1
Der er forskel på programmer udviklet til 32 bit og til 64 bit.

Under din Configuration manager i Visual Studio kan du sætte om programmet skal bygget til 32 eller 64 bit.
Avatar billede shemeri Praktikant
07. oktober 2010 - 13:50 #2
Ja, det er jeg klar over men er der ikke en anden måde så den virker i begge 32bit og 64bit?

Jeg så følgende post:
http://www.experts-exchange.com/Programming/Languages/.NET/Q_24821266.html

hvor de forslog at bruge
Marshal.AllocHGlobal Method

Men kan ikke lige se hvordan :-)
Avatar billede shemeri Praktikant
07. oktober 2010 - 13:57 #3
Er der en alternativ til følgende linie:

Marshal.FreeCoTaskMem(Buff);

Så den virker i både 32bit og 64bit??
Avatar billede cdull Nybegynder
07. oktober 2010 - 14:14 #4
Avatar billede shemeri Praktikant
07. oktober 2010 - 14:44 #5
Nej cdull, det er ikke nok :-)

64bit kan ikke lige følgende linie:
Marshal.FreeCoTaskMem(Buff);
Avatar billede arne_v Ekspert
08. oktober 2010 - 02:36 #6
Marshal.FreeCoTaskMem må betyde at der er noget COM involveret.

COM er unmanaged kode og derfor enten 32 eller 64 bit.

Managed .NET kode derimod kan køre på både 32 og 64 bit (hvis man ikke ændrer default platform fra anycpu).

Men vi skal nok vide lidt mere om hvad for noget COM du kalder og hvordan.
Avatar billede shemeri Praktikant
08. oktober 2010 - 09:25 #7
Arne_v:

Det har du ret i :-)

Der er noget COM involveret og jeg har ikke ændret i "anycpu" option.

Jeg tror jeg fandt problemet men kan alligevel duobletjekkes :-)

Gemmes der noget i memory ved at kalde: Marshal.UnsafeAddrOfPinnedArrayElement();

Jeg tror problemet var at jeg kalde følgende:
1: Marshal.UnsafeAddrOfPinnedArrayElement(buff, 0);
2: Marshal.FreeCoTaskMem(buff);

og hvis kald 1 ikke gemme noget, fejler kald 2? Men det er interessant at xp, vista og win7 i 32bit klager ikke over det, men det gør win7 64bit?
Avatar billede arne_v Ekspert
08. oktober 2010 - 16:20 #8
Det ser forkert ud.

Docs siger:

You can use FreeCoTaskMem to free any memory allocated by AllocCoTaskMem, ReAllocCoTaskMem, or any equivalent unmanaged method.
Avatar billede shemeri Praktikant
09. oktober 2010 - 00:48 #9
Så må det være derfor den fejler :-)

Men hvorfor tror du den fejler kun i 64bit og ikke 32bit?
Avatar billede arne_v Ekspert
09. oktober 2010 - 01:47 #10
Det kan være tilfældigt.

Husk at C# er et sprog hvor ting normalt enten virker eller altid giver en fejl, men C/C++ er sprog hvor ting enten virker eller resulterer i uforudsigelige fejl.

På 32 bit overskriver den sikkert et stykke memory som ikke skal bruges, mens den på 64 bit crasher.
Avatar billede arne_v Ekspert
20. november 2010 - 01:13 #11
Kommet videre?
Avatar billede shemeri Praktikant
20. november 2010 - 01:37 #12
tak :-)
Avatar billede shemeri Praktikant
20. november 2010 - 01:38 #13
arne_v
du må gerne svar :-)
Avatar billede arne_v Ekspert
20. november 2010 - 01:49 #14
svar
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