نوشته شده توسط
salehsam
سلام
میشه در مورد کار با تابع GetLastError بیشتر توضیح بدین؟
ممنون
اکثر توابع API ویندوز، وقتی به دلیلی به مشکل میخورن (مثلا وروردی اشتباه)، کد خطای اونها رو میشه با استفاده از تابع GetLastError دریافت کرد و از طریق اون فهمید علت خطا چیه.در 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);