Jak nastavit systémový čas PC Machine z .Netu   zodpovězená otázka

Algoritmy, WinForms, WinAPI

Přeji dobrý den,

poradil by prosím někdo?

Potřeboval bych nastavit z prostředí VB.Net systémový čas PC Machine. Googlováním jsem došel k tomuto kódu:

Structure SYSTEMTIME
        Dim wYear As Integer
        Dim wMonth As Integer
        Dim wDayOfWeek As Integer
        Dim wDay As Integer
        Dim wHour As Integer
        Dim wMinute As Integer
        Dim wSecond As Integer
        Dim wMilliseconds As Integer
    End Structure

    Private Declare Function SetSystemTime Lib "kernel32" (ByVal lpSystemTime As SYSTEMTIME) As Long


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim lReturn As Long
        Dim lpSystemTime As SYSTEMTIME
        lpSystemTime.wYear = 1996
        lpSystemTime.wMonth = 6
        lpSystemTime.wDayOfWeek = 5
        lpSystemTime.wDay = 28
        lpSystemTime.wHour = 9
        lpSystemTime.wMinute = 42
        lpSystemTime.wSecond = 0
        lpSystemTime.wMilliseconds = 0
        lReturn = SetSystemTime(lpSystemTime)
    End Sub

bohužel po spustění se zasekne na chybě přístupu do chráněné paměti a nevím jak to dořešit.

Díky za jakékoliv případné i popostrčení.. :-)

Pj

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém bude buď v definici struktury a funkce, nebo v nedostatečném oprávnění běžícího procesu. Ujistěte se, zda-li účet pod kterým pracujete má členství v Administrators a zda-li je vypnuté UAC. Následující kód je funkční:

Imports System.Runtime.InteropServices
Module Module1
  Sub Main()
    Dim systemTime As SYSTEMTIME
    If Not GetSystemTime(systemTime) Then
      Console.WriteLine(String.Format("Při získávání času došlo k chybě {0:N0}", _
                                      Marshal.GetLastWin32Error()))
    End If
    systemTime.wDay += 1
    If Not SetSystemTime(systemTime) Then
      Console.WriteLine(String.Format("Při nastavování času došlo k chybě {0:N0}", _
                                      Marshal.GetLastWin32Error()))
    End If
    Console.WriteLine("Čas byl posunut o jeden den dopředu.")
    Console.ReadKey()
  End Sub
  Public Structure SYSTEMTIME
    Public wYear As Short
    Public wMonth As Short
    Public wDayOfWeek As Short
    Public wDay As Short
    Public wHour As Short
    Public wMinute As Short
    Public wSecond As Short
    Public wMilliseconds As Short
  End Structure
  <DllImport("kernel32.dll", SetLastError:=True)> _
  Public Function GetSystemTime(ByRef lpSystemTime As SYSTEMTIME) As Boolean
  End Function
  <DllImport("kernel32.dll", SetLastError:=True)> _
  Public Function SetSystemTime(ByRef lpSystemTime As SYSTEMTIME) As Boolean
  End Function
End Module

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

díky moc za Vaši pomoc.

účet pod kterým to běží je admin.

Co myslíte tím vypnutí UAC?

VisualStudio mi ale nechce strávit tuto deklaraci:

<DllImport("kernel32.dll", SetLastError:=True)> _
  Public Function SetSystemTime(ByRef lpSystemTime As SYSTEMTIME) As Boolean
  End Function

u názvu funkce SetSystemTime mi to hlásí chybu:

System.Runtime.InteropServices.DllImportAtribute cannot be applied to instance method.

Bádám dále nad tím co je ještě špatně...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

UAC je Nástroj řízení uživatelských účtů, neboli zrůdnost zavedená od Windows Vista za účelem co největšího obtěžování uživatele pitomostmi. Vypíná se v Ovládací panely/Uživatelské účty a má vliv na spoustu věcí ohledně oprávnění. Divím se jaktože chcete programovat a neznáte tuto věc.

K té chybě v deklaraci: Kde máte deklarovanou tu funkci? Přesuňte ji do zvláštního modulu (nejlépe s názvem UnsafeNativeMethods).

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Díky za reakci.

Visty neznám, jsem tak trochu ještě pozadu (XP) :-)

ale člověk se pořád učí.

nakonec jsem se dobádal do zdárného konce.

jen pro pořádek, kdyby někdo jiný někdy něco podobného řešil, přikládám kousek kódu který mi nakonec fungoval bez chybových hlášení.

Private Structure SYSTEMTIME
        Public year As Short
        Public month As Short
        Public DayOfWeek As Short
        Public day As Short
        Public hour As Short
        Public minute As Short
        Public second As Short
        Public miliseconds As Short
    End Structure

    Private Declare Function SetLocalTime Lib "kernel32.dll" (ByRef lpSystemTime As SYSTEMTIME) As Boolean

    Public Function UpdateSystemTime(ByVal DateObject As Date) As Boolean
        Dim newDT As SYSTEMTIME
        With newDT
            .day = DateObject.Day
            .DayOfWeek = DateObject.DayOfWeek
            .month = DateObject.Month
            .year = DateObject.Year
            .hour = DateObject.Hour
            .minute = DateObject.Minute
            .second = DateObject.Second
            .miliseconds = DateObject.Millisecond
        End With
        Dim blnResult As Boolean = SetLocalTime(newDT)
        Return blnResult
    End Function


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim NewDate As DateTime = Date.Parse("1/15/2010 11:11:11")
        UpdateSystemTime(NewDate)

    End Sub

Nastavuje datum i čas jedna báseň :-)

Nevím jestli je to "programátorsky zcela správně" ale funguje to, což je hlavní.

Díky za pomoc !! Je fajn se mít kde a koho zeptat.

Pj

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback