C# C# Anfänger -> System.AccessViolationException wurde nicht behandelt.

Syntexer

Lt. Commander
Registriert
Okt. 2004
Beiträge
1.052
Hi,

ich versuche gerade ein total simples Programm auf die Beine zu stellen.
Sind so meine ersten Anläufe mit C#. Das Programm soll wenn es fertig ist (Konsolenanwenung) einfach über einen Parameter die aktuelle Uhrzeit auf eine die über Parameter übergeben Uhrzeit ändern. Ich wollte jetzt einfach mal das SetTime testen aber komme nicht klar.

das ist das Problem:
Code:
System.AccessViolationException wurde nicht behandelt.
  Message=Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
  Source=ConsoleApplication2
  StackTrace:
       bei Program.SetSystemTime(str_Zeit neueZeit)
       bei Program.Main(String[] args) in C:\Users\Markus\Documents\Visual Studio 2010\Projects\ConsoleApplication2\ConsoleApplication2\time.cs:Zeile 31.
       bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()
  InnerException:

und das ist der Code:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

class Program
    {

    struct str_Zeit
    {
        public short Jahr;
        public short Monat;
        public short TagInDerWoche;
        public short Tag;
        public short Stunde;
        public short Minute;
        public short Sekunde;
        public short Millisekunde;
    }
    

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetSystemTime(str_Zeit neueZeit);

        static void Main(string[] args)
        {
            str_Zeit Zeit = new str_Zeit();
            Zeit.Jahr = (short)1980;
            
               SetSystemTime(Zeit);   
        }
    }

Wo ist nun, der mit Sicherheit total banale, Fehler?

Vielen Dank für eure Hilfe!
 
Zuletzt bearbeitet:
Eventuell hat deine Anwendung nicht die Rechte, um die Zeit zu ändern. Also musst du sie vlt als Administrator starten oder etwas ähnliches.
 
Die Funktion scheint wohl mit deiner Struktur "str_Zeit" nicht zurechtzukommen. Deshalb bekommst du eine Speicherschutzverletzung.
Versuch mal die Struktur so zu deklarieren wie hier beschrieben: pinvoke.net: SYSTEMTIME

Bei Win32-Interop muss man sehr genau auf die richtigen Datenstrukturen achten. Deshalb im Zweifel auf pinvoke.net die richtige Verwendung einer solchen Funktion nachschlagen.
 
Zuletzt bearbeitet: (Link)
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

class Program
{

    public struct SYSTEMTIME
    {
        public short wYear;
        public short wMonth;
        public short wDayOfWeek;
        public short wDay;
        public short wHour;
        public short wMinute;
        public short wSecond;
        public short wMilliseconds;
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetSystemTime([In] ref SYSTEMTIME st);

    static void Main(string[] args)
    {


        SYSTEMTIME st = new SYSTEMTIME();
        st.wYear = 2003;
        st.wMonth = 5;
        st.wDay = 22;
        st.wHour = 0;
        st.wMinute = 0;
        st.wSecond = 0;

        SetSystemTime(ref st);
    }
}


so Funktioniert es jetzt. Aber könnte mir bitte jemand erklären warum das so ist :)? will ja auch verstehen was ich da tue.
 
Hier war wohl das ref-Keyword ausschlaggebend.
"SetSystemTime" erwartet einen Pointer auf eine "SYSTEMTIME"-Struktur. Da in C# Strukturen standardmäßig "by value", d. h. eine Kopie der Struktur und keine Referenz auf die Struktur übergeben wird, musst du mit "ref" explizit die Referenz übergeben.
 
Zurück
Oben