Press "Enter" to skip to content

Władca czasu

Chyba wrócę do bycia interopem. Można dostać euforii (żeby nie nazwać tego inaczej) kiedy wywołuje się w swoim kodzie czyiś kod, zwłaszcza, jeżeli nie był on dedykowany specjalnie na Twoją platformę. Kiedy wywołujesz jakąś losową dllkę, napisaną w czymkolwiek pod cokolwiek… a już najwyższym stopniem tejże euforii będzie … wywołanie funkcji z dllki systemowej. Takiej wiecie, System32 czy coś… takiej, no weźmy kernel32.dll. Brzmi strasznie. Zróbmy coś, od czego komp nie wybuchnie. Ustawmy mu czas.

Ta funkcja wg msdna wygląda mniej więcej tak:

BOOL WINAPI SetSystemTime(
  _In_ const SYSTEMTIME *lpSystemTime
);

ok, czyli mamy sobie jakiś wskaźnik (referencję też powinno łyknąć) na strukturę typu SYSTEMTIME i zwraca nam w ogólnej mierze boola. No tego SYSTEMTIME nie mamy, więc musimy go sobie wystrugać samodzielnie. Klik na msdn  i mamy coś koło tego

typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;

Także musimy to przetłumaczyć z C na C#. Powinno wyjść coś takiego

 [StructLayout(LayoutKind.Sequential)] //ma być po kolei w pamięci – bez kombinowania
    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;
    }

Jedyne co nam pozostaje, to napisać prosty mapper ze zwykłego datetime’a na tą strukturkę, a potem po prostu stworzyć prosty wrapper, który się sprowadzi do:

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

//i wywołanie ograniczy się do 
//MojWrapper.SetSystemTime(ref st); 

W ten sposób można się bawić z dowolnymi funkcjami do woli.

One Comment

  1. Władca czasu

    Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl

Comments are closed.