2016-04-11 25 views
5

Viene visualizzato un errore quando sto tentando di utilizzare platform invoke esempio in cui sto cercando di modificare il caso Lower e Upper di string.Errore di richiamo della piattaforma tentato di leggere o scrivere memoria protetta

Ecco quello che ho ottenuto finora:

class Program 
{ 
    [DllImport("User32.dll", EntryPoint = "CharLowerBuffA", 
    ExactSpelling = false, 
    CharSet = CharSet.Unicode, 
    SetLastError = true 
    )] 
    public static extern string CharLower(string lpsz); 

    [DllImport("User32.dll", 
    EntryPoint = "CharUpperBuffA", 
    ExactSpelling = false, 
    CharSet = CharSet.Unicode, 
    SetLastError = true 
    )] 
    public static extern string CharUpper(string lpsz);  

    static void Main(string[] args) 
    { 
     string l = "teSarf"; 

     string ChangeToLower = CharLower(l.ToLower()); 
     string ChangeToUpper = CharUpper(l.ToUpper()); 
     Console.WriteLine("{0}", ChangeToLower); 
     Console.ReadLine(); 
    } 
} 

io non sono sicuro di dove sto andando male con questo, ma penso che sia a che fare con la EntryPoint.

devo usare Unicode e CharLowerBuffW non ha funzionato neanche.

Come posso risolvere questo?

risposta

3

Microsoft's documentation indica che CharLowerBuffA è la variante ANSI di tale metodo, ma si specifica Unicode.

Provare ad utilizzare ANSI, specificando CharSet = CharSet.Ansi, oppure se è necessario Unicode, utilizzare CharLowerBuffW e CharUpperBuffW.

Inoltre, il metodo accetta due parametri. Non hai il secondo. Quindi provare questo:

[DllImport("User32.dll", EntryPoint = "CharLowerBuffW", 
ExactSpelling = false, 
CharSet = CharSet.Unicode, 
SetLastError = true 
)] 
public static extern string CharLower(string lpsz, int cchLength); 

[DllImport("User32.dll", 
EntryPoint = "CharUpperBuffW", 
ExactSpelling = false, 
CharSet = CharSet.Unicode, 
SetLastError = true 
)] 
public static extern string CharUpper(string lpsz, int cchLength); 

E chiamare in questo modo:

string ChangeToLower = CharLower(l, l.Length); 

Se questo ancora non funziona, quindi provare a utilizzare array di caratteri, come NatarajC menzionato.

+2

CharUpperBuffW ha ottenuto lo stesso risultato e ho bisogno di unicode –

+0

Ho anche notato che manca il parametro length. Ho aggiornato la mia risposta. –

1

Lo stesso risultato significa che sta ancora dando lo stesso errore, provare a utilizzare string.ToCharArray() mentre si chiama il metodo, modificare la firma in array di caratteri.