.Чистый - получить дату с указателем даты Ole


Так что у меня этот SDK я работаю с, который живет в неуправляемых землях, и когда она хочет сказать мне что-то конкретное он посылает меня в частности, Windows API сообщение и передает указатель на свидание в lparam этого сообщения. Я выяснил, что дата ОА-совместимый (двойное представление дробного числа дней с начала эпохи), и поэтому после некоторых игры вокруг я придумал это:

  • Разыменовать указатель на сортировочных необработанных битов по адресу в значение типа int64.
  • Выполнять преобразования поразрядного из int64 в двуспальную.
  • Относиться к тому, что дважды в качестве даты ОА и передать его статические методы типа datetime, чтобы получить ответ.

Он отлично работает, но концептуально это звучит очень запутано; указатель, чтобы долго, чтобы удвоить (битовой загрузки), в datetime. Другие, чем встраивание этих трех линий С будет храниться только окончательный результат, есть ли более прямой способ .Net в свою очередь тип IntPtr к Ole-дата в дату?

private void GetDateFromWinMsg(Message message)
    {
        ...
        var dateAsULong = Marshal.ReadInt64(message.LParam);
        var dateAsDouble = BitConverter.Int64BitsToDouble(dateAsULong);
        var dateTime = DateTime.FromOADate(dateAsDouble);
        ...
    }


856
5
задан 16 сентября 2011 в 05:09 Источник Поделиться
Комментарии
1 ответ

Я согласен с @IAbstract, что этот код выглядит нормально. Я бы обернуть его и имя его по-разному, поскольку ничто в текущий код показывает, что он является указателем на Оле/дата ОА.

public DateTime DateTimeFromOLEDatePointer(Int64 oaDate)
{
var dateAsULong = Marshal.ReadInt64(oaDate);
var dateAsDouble = BitConverter.Int64BitsToDouble(dateAsULong);
var dateTime = DateTime.FromOADate(dateAsDouble);
}

Использование:

private void GetDateFromWinMsg(Message message)
{
return DateTimeFromOLEDatePointer(message.LParam);
}

Также можно сделать методом расширения.

2
ответ дан 16 января 2012 в 05:01 Источник Поделиться