Почему значение переменной по умолчанию DateTime изменяется после отправки в качестве сообщения? - PullRequest
0 голосов
/ 27 мая 2019

Я разрабатываю два приложения, которые общаются с помощью сообщений. Я получил проблему, похожую на ошибку, при получении значения даты и времени по умолчанию.

Я ожидал получить значение по умолчанию datetime '1/01/0001 12:00:00 AM' , но получил '30 / 12 / 1899 12:00:00 AM вместо

Переменная datetime является членом структуры, и структура передается в COPYDATASTRUCT.

Я пытался присвоить ему новые DateTime (), default (DateTime) и .MinValue, но результат был таким же. Я предполагаю, что это изменено ОС Windows. Возможно, значение по умолчанию отличается в ОС Windows и C #.

Это простой следующий код.

[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
    public IntPtr dwData;
    public int    cbData;
    public IntPtr lpData;
}
public struct USERMSGSTRUCT
{
    public DateTime date;
}
public static class WinMessages
{
    public const int WM_COPYDATA = 0x004A;
    public const int WM_USER     = 0x0400;
    public const int WM_APP      = 0x8000;
}
public static class UserMessages
{
    public const int UM_CONNECT = 100;
}
[DllImportAttribute("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

Это код для отправки сообщения, содержащего переменную DateTime.

Sender.cs

private void Form1_Load(object sender, EventArgs e)
{
    USERMSGSTRUCT ums = new USERMSGSTRUCT();
    COPYDATASTRUCT cds;
    IntPtr targetHwnd = IntPtr.Zero;

    // Finds target Application Handle
    Process[] pname = Process.GetProcessesByName("Receiver"); // <-- Put the process name of the receiver application.
    if (pname.Length > 0)
    { targetHwnd = pname[0].MainWindowHandle; }

    // CDS Message
    cds.dwData = IntPtr.Zero;
    cds.cbData = Marshal.SizeOf(ums);

    IntPtr structPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(ums));
    Marshal.StructureToPtr(ums, structPtr, false);
    cds.lpData = structPtr;

    IntPtr iPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(cds));
    Marshal.StructureToPtr(cds, iPtr, false);

    // Prints the value of DateTime var. and sends it to the target App.
    Console.WriteLine(ums.date);    // <-- '1/01/0001 12:00:00 AM'
    SendMessage(
        targetHwnd, 
        (int)WinMessages.WM_COPYDATA, 
        new IntPtr(UserMessages.UM_CONNECT), 
        iPtr);

    Marshal.FreeCoTaskMem(iPtr);
    Marshal.FreeCoTaskMem(structPtr);
}

Receiver.cs

protected override void WndProc(ref Message m)
{
    COPYDATASTRUCT cds;
    USERMSGSTRUCT ums;

    if ((uint)m.Msg == WinMessages.WM_COPYDATA)
    {
        cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
        ums = (USERMSGSTRUCT)Marshal.PtrToStructure(cds.lpData, typeof(USERMSGSTRUCT));

        switch ((uint)m.WParam) // User Message
        {
            case UserMessages.UM_CONNECT:
                Console.WriteLine(ums.date); // <-- '30/12/1899 12:00:00 AM'
                break;
            default: break;
        }
    }

    base.WndProc(ref m);
}

Как получить значение по умолчанию для переменной DateTime при получении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...