PDA

View Full Version : مشکل در تغییر تاریخ و ساعت سیستم



vahid.v
شنبه 09 آذر 1392, 17:14 عصر
سلام
میخام ساعت و تاریخ سیستم رو تغییر بدم ولی نمیشه!
کل مطالب اینترنت روزیر و رو کردم ولی جواب نمیده،
نمیدونم چرا،
ویندوزم سون هست کدها روش جواب نمیده،
مثلا کد زیر:



using System.Globalization;




[StructLayout(LayoutKind.Sequential)]
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);

private void Form1_Load(object sender, EventArgs e)
{
SYSTEMTIME st = new SYSTEMTIME();
st.wYear = 2005; // must be short
st.wMonth = 5;
st.wDay = 22;
st.wHour = 1;
st.wMinute = 1;
st.wSecond = 1;

SetSystemTime(ref st);

}






مشکل از چیه؟؟؟؟

plus
شنبه 09 آذر 1392, 22:40 عصر
فایل exe رو به صورت Run as Administrator اجرا کنید تا اجازه تنظیم ساعت رو داشته باشه.
پ.ن:
وقتی با توابع Windows API کاری رو میخواین انجام بدین و اونطور که انتظار دارین انجام نمیشه، با تابع GetLastError کد آخرین خطا رو بدست بیارین و با تابع FormatMessage و یا از طریق این آدرس http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx علت خطا رو متوجه بشین...
هرچند توی MSDN توی توضیحات همین تابع SetSystemTime هم نوشته بود که نیاز Special Privileges داره.

salehsam
شنبه 09 آذر 1392, 23:05 عصر
سلام
میشه در مورد کار با تابع GetLastError بیشتر توضیح بدین؟
ممنون

plus
شنبه 09 آذر 1392, 23:45 عصر
سلام
میشه در مورد کار با تابع GetLastError بیشتر توضیح بدین؟
ممنون

اکثر توابع API ویندوز، وقتی به دلیلی به مشکل میخورن (مثلا وروردی اشتباه)، کد خطای اونها رو میشه با استفاده از تابع GetLastError (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx)دریافت کرد و از طریق اون فهمید علت خطا چیه.در MSDN، لیست Error Code های سیستم هست.(لینکش رو در پست قبل دادم).و البته از طریق تابع FormatMessage هم میشه متن خطا رو از طریق کد اون، بدست آورد. برای مثال، همین مشکلی که موضوع تاپیک هست رو میشه به صورت زیر متن خطا رو بدست آورد:


private void Form1_Load(object sender, EventArgs e)
{
SYSTEMTIME st = new SYSTEMTIME();
st.wYear = 2013; // must be short
st.wMonth = 11;
st.wDay = 30;
st.wHour = 23;
st.wMinute = 16;
st.wSecond = 0;

bool succeed = SetSystemTime(ref st);
if (!succeed)
{
uint errorCode = GetLastError();
IntPtr pMessage = IntPtr.Zero;
if (0 != FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
IntPtr.Zero, errorCode, 0, ref pMessage, 0, IntPtr.Zero))
{
string message = Marshal.PtrToStringAnsi(pMessage);
LocalFree(pMessage);
MessageBox.Show(string.Format("Failed to set system time: {0}", message));
}

}
}

// from header files
const uint FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
const uint FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
const uint FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;
const uint FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000;
const uint FORMAT_MESSAGE_FROM_HMODULE = 0x00000800;

const uint FORMAT_MESSAGE_FROM_STRING = 0x00000400;
[StructLayout(LayoutKind.Sequential)]
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")]
static extern uint GetLastError();

[DllImport("kernel32.dll")]
static extern uint FormatMessage(uint dwFlags, IntPtr lpSource,
uint dwMessageId, uint dwLanguageId, ref IntPtr lpBuffer,
uint nSize, IntPtr Arguments);

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LocalFree(IntPtr hMem);

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