Ошибка: (4025) Несовместимый тип для аргумента №.1: получил "_SYSTEMTIME", ожидаемый "TSystemTime" - PullRequest
0 голосов
/ 24 ноября 2018

У меня была такая проблема с TSystemTime!В Delphi 7 есть проект, который отлично работает!Я перевожу эту программу на Android, поэтому выбор пал на Lazarus, поскольку у него есть возможность программировать под нужную мне платформу.

Когда я начал запускать программу под Android, компилятор начал ругаться на Windows.пас который там используется.Я выполнил это полностью и просто добавил тип, константу, процедуру, функцию, которые мне нужны, к проекту, и тут началось самое интересное ...

Вот часть кода, где ошибки:

 function NowUTC: TDateTime;
var
  st: TSystemTime;
begin
  Uninit(st);
  GetSystemTime(st);
  result := SystemTimeToDateTime(st); //error
end;

function UtcToLocal(utcTime: TDateTime): TDateTime;
var
  st: TSystemTime;
  lt: TSystemTime;
begin
  DateTimeToSystemTime(utcTime, st);  <- error
  Uninit(lt);
  SystemTimeToTzSpecificLocalTime(nil, st, lt);
  result := SystemTimeToDateTime(lt);  <- error
end;
function LocalToUTC(localTime: TDateTime): TDateTime;
var
  inverseTZ: TTimeZoneInformation;
  st: TSystemTime;
  ut: TSystemTime;
begin
  DateTimeToSystemTime(localTime, st);  <- error
  Uninit(inverseTZ);
  GetTimezoneInformation(inverseTZ);
  inverseTZ.Bias := -inverseTZ.Bias;
  inverseTZ.DaylightBias := -inverseTZ.DaylightBias;
  Uninit(ut);
  SystemTimeToTzSpecificLocalTime(@inverseTZ, st, ut);
  result := SystemTimeToDateTime(ut);  <- error
end;

function UtcDateTimeToFiletime(utcDateTime: TDateTime): TFileTime;
var
  st: TSystemTime;
begin
  DateTimeToSystemTime(utcDateTime, st); <- error
  Uninit(result);
  SystemTimeToFileTime(st, result);
end; 

function FileTimeToLocalDateTime(const ft: TFileTime): TDateTime;
var
  st: TSystemTime;
  lft: TFileTime;
begin
  Uninit(lft);
  FileTimeToLocalFileTime(ft, lft);
  Uninit(st);
  FileTimeToSystemTime(lft, st);
  result := SystemTimeToDateTime(st); <- error
end;

И компилятор показывает такие ошибки:

Error: (4025) Incompatible type for arg no. 1: Got "_SYSTEMTIME", expected "TSystemTime"
Error: (3069) Call by var for arg no. 2 has to match exactly: Got "_SYSTEMTIME" expected "TSystemTime"
Error: (4025) Incompatible type for arg no. 1: Got "_SYSTEMTIME", expected "TSystemTime"
Error: (3069) Call by var for arg no. 2 has to match exactly: Got "_SYSTEMTIME" expected "TSystemTime"
Error: (4025) Incompatible type for arg no. 1: Got "_SYSTEMTIME", expected "TSystemTime"
Error: (3069) Call by var for arg no. 2 has to match exactly: Got "_SYSTEMTIME" expected "TSystemTime"
Error: (4025) Incompatible type for arg no. 1: Got "_SYSTEMTIME", expected "TSystemTime"

Вот тип, который я использую:

{TSystemTime}
  { System time is represented with the following structure: }
  PSystemTime = ^TSystemTime;
  _SYSTEMTIME = record
    wYear: Word;
    wMonth: Word;
    wDayOfWeek: Word;
    wDay: Word;
    wHour: Word;
    wMinute: Word;
    wSecond: Word;
    wMilliseconds: Word;
  end;
  {$EXTERNALSYM _SYSTEMTIME}
  TSystemTime = _SYSTEMTIME; 
  SYSTEMTIME = _SYSTEMTIME;
  {$EXTERNALSYM SYSTEMTIME}

В типе написано, что этоТо же самое (TSystemTime = _SYSTEMTIME) Помогите, пожалуйста, понять.Ну и в добавок может помочь процедура, функция которую я взял из Windows.pas ...

procedure GetSystemTime(var lpSystemTime: TSystemTime); stdcall;
{$EXTERNALSYM GetSystemTime}
procedure GetSystemTimeAsFileTime(var lpSystemTimeAsFileTime: TFileTime); stdcall;
{$EXTERNALSYM GetSystemTimeAsFileTime}
function SetSystemTime(const lpSystemTime: TSystemTime): BOOL; stdcall;
{$EXTERNALSYM SetSystemTime}
procedure GetLocalTime(var lpSystemTime: TSystemTime); stdcall;
{$EXTERNALSYM GetLocalTime}
function SetLocalTime(const lpSystemTime: TSystemTime): BOOL; stdcall;
{$EXTERNALSYM SetLocalTime}
function GetSystemTimeAdjustment(var lpTimeAdjustment, lpTimeIncrement: DWORD;
  var lpTimeAdjustmentDisabled: BOOL): BOOL; stdcall;
{$EXTERNALSYM GetSystemTimeAdjustment}
function SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation: PTimeZoneInformation;
  var lpUniversalTime, lpLocalTime: TSystemTime): BOOL; stdcall;
{$EXTERNALSYM SystemTimeToTzSpecificLocalTime}
function GetTimeZoneInformation(var lpTimeZoneInformation: TTimeZoneInformation): DWORD; stdcall;
{$EXTERNALSYM GetTimeZoneInformation}
function SetTimeZoneInformation(const lpTimeZoneInformation: TTimeZoneInformation): BOOL; stdcall;
{$EXTERNALSYM SetTimeZoneInformation}
function SystemTimeToFileTime(const lpSystemTime: TSystemTime; var lpFileTime: TFileTime): BOOL; stdcall;
{$EXTERNALSYM SystemTimeToFileTime}
function FileTimeToLocalFileTime(const lpFileTime: TFileTime; var lpLocalFileTime: TFileTime): BOOL; stdcall;
{$EXTERNALSYM FileTimeToLocalFileTime}
function LocalFileTimeToFileTime(const lpLocalFileTime: TFileTime; var lpFileTime: TFileTime): BOOL; stdcall;
{$EXTERNALSYM LocalFileTimeToFileTime}
function FileTimeToSystemTime(const lpFileTime: TFileTime; var lpSystemTime: TSystemTime): BOOL; stdcall;
{$EXTERNALSYM FileTimeToSystemTime}
procedure OutputDebugString(lpOutputString: PChar); stdcall;
{$EXTERNALSYM OutputDebugString}

1 Ответ

0 голосов
/ 24 ноября 2018

Вы не публикуете что-либо скомпилируемое (пропущено с использованием предложений и т. Д.), Поэтому первым шагом было бы выбросить все это и свести проблему к минимуму.

Тем не менее, если вы объявите tsystemtime самостоятельнои затем передайте его подпрограмме модуля Windows, которая ожидает тип, объявленный в модуле Windows, тогда неудивительно, что он не работает.

...