Я разрабатываю два приложения, которые общаются с помощью сообщений. Я получил проблему, похожую на ошибку, при получении значения даты и времени по умолчанию.
Я ожидал получить значение по умолчанию 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 при получении?