Avatar billede brian0905 Nybegynder
06. juli 2004 - 11:04 Der er 10 kommentarer og
1 løsning

Mit program crasher efter denne kode

public void AllocateGlobalMem(string myString)
        {
            char[] teststring = myString.ToCharArray();
            IntPtr myHandle = Marshal.AllocHGlobal(myString.Length);
            Console.WriteLine("Global handle: "+Convert.ToString(myHandle));
            Marshal.Copy(teststring, 0, myHandle, teststring.Length);
            Console.WriteLine("Writing to memory");
            Console.WriteLine("Reading from memory");
           
            string mytext = Marshal.PtrToStringUni(myHandle);
            Console.WriteLine("String read from mem: "+mytext);
            Marshal.FreeHGlobal(myHandle);
        }

Herefter laver den en NullPointer exception i min main metode........
Avatar billede finger Nybegynder
06. juli 2004 - 11:07 #1
hvorfor i alverden vil du selv allokere mem i C#? det klarer .NET jo selv for dig med Garbage collection
Avatar billede brian0905 Nybegynder
06. juli 2004 - 11:09 #2
Jeg skal kommunikere med et andet program, der ikke er .NET. Jeg sender en message til dette program så henter det en streng i hukommelsen.... Det virker fint med int men med string så chrasher mit program
Avatar billede chries Nybegynder
06. juli 2004 - 11:13 #3
har du prøvet myString.Length + 1 ? skal der ikke være plads til nulterminering ?
Avatar billede finger Nybegynder
06. juli 2004 - 11:15 #4
null pointer exception opstår vel fordi du kalder
Marshal.FreeHGlobal(myHandle);

myHandle må vel være "ryddet op" af garbage collection....

Prøv med en try catch blok uden om din kode.

try
{
  ....
}
catch()
{
  //catch()! ikke catch(Exception). på denne måde fanges exceptions der er unmanaged også
}
Avatar billede arne_v Ekspert
06. juli 2004 - 11:19 #5
Gæt:

Prøv:

IntPtr myHandle = Marshal.AllocHGlobal(2*myString.Length);

C# chars fylder 2 byte !
Avatar billede arne_v Ekspert
06. juli 2004 - 11:20 #6
Og så:

string mytext = Marshal.PtrToStringUni(myHandle, teststring.Length);

fordi der ikke er nogen terminerende nul byte
Avatar billede brian0905 Nybegynder
06. juli 2004 - 11:26 #7
Det var nultermineringen der manglede !!! jeg skrev myString.length+1 og så kørte det som det skulle..... Tusind tak for hjælpen, lav lige et svar så du får points. Hvorfor får jeg ikke lov til at skrive

try
{
......
}
catch()
{
...
}

Som det blev foreslået? den kræver at der kommer en Exception klasse med.....
Avatar billede finger Nybegynder
06. juli 2004 - 11:32 #8
ah. det er catch uden parenteser....
Avatar billede brian0905 Nybegynder
06. juli 2004 - 11:50 #9
takker.......
Avatar billede wisen Nybegynder
09. juli 2004 - 08:49 #10
.. der er en anden metode på Marshal - StringToHGlobalUni... har du prøvet med den?
Avatar billede brian0905 Nybegynder
09. november 2004 - 15:46 #11
husk at svare, jeg er i gang med at rydde op i mine udeståender og kan ikke give points uden et 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