Winapi Pascal:从LPSYSTEMTIME记录获取字段

Winapi Pascal:从LPSYSTEMTIME记录获取字段,winapi,record,pascal,Winapi,Record,Pascal,我正在使用Win32 api获取文件的日期和时间。我有一个LPSYSTEMTIME结构,我正试图打印它的wYear变量 我有一个函数(GetFileDate): 但是当我这么做的时候 begin Write(GetFileDate.wYear); end. 它吐了回来 有关此的任何帮助?LPSYSTEMTIME是指向SYSTEMTIME结构的指针。尝试使用^操作符取消对该指针的引用,例如: Write(GetFileDate^.wYear); 或: 话虽如此,除了您根本没有进行任何错

我正在使用Win32 api获取文件的日期和时间。我有一个LPSYSTEMTIME结构,我正试图打印它的wYear变量

我有一个函数(GetFileDate):

但是当我这么做的时候

begin
    Write(GetFileDate.wYear);
end.
它吐了回来


有关此的任何帮助?

LPSYSTEMTIME
是指向
SYSTEMTIME
结构的指针。尝试使用
^
操作符取消对该指针的引用,例如:

Write(GetFileDate^.wYear);
或:

话虽如此,除了您根本没有进行任何错误处理之外,您的
GetFileDate()
实现正在将错误的参数值传递给各种API函数。这些代码甚至不应该编译,更不用说正确运行了

请尝试以下方法:

function GetFileDate : SYSTEMTIME;
var 
  CheckFile: HANDLE; 
  FileTime: FILETIME; 
  FileTimeReturn: FILETIME; 
  SystemTimeReturn: SYSTEMTIME;
  GetFileDateResult: SYSTEMTIME;
begin 
  ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
  CheckFile := CreateFile('FullPathTo\main.pas', GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
  if CheckFile <> INVALID_HANDLE_VALUE then
  begin
    if GetFileTime(CheckFile, @FileTime, nil, nil) then
    begin
      if FileTimeToLocalFileTime(@FileTime, @FileTimeReturn) then
      begin
        if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
          GetFileDateResult := SystemTimeReturn;
      end;
    end;
    CloseHandle(CheckFile);
  end; 
  GetFileDate := GetFileDateResult;
end; 

begin   
  Write(GetFileDate.wYear);   
end.

实际上我已经试过了,但它只是说在$75C58D46处有运行时错误216。然后是一些内存垃圾。@SuperDisk:然后编辑您的问题并发布更多显示
GetFileDate
的代码。您的
GetFileDate()
实现完全错误。您正在向各种API函数传递未初始化的指针。如果编译器接受了您的代码,它将在运行时崩溃。
Write(GetFileDate^.wYear);
Write(GetFileDate()^.wYear);
function GetFileDate : SYSTEMTIME;
var 
  CheckFile: HANDLE; 
  FileTime: FILETIME; 
  FileTimeReturn: FILETIME; 
  SystemTimeReturn: SYSTEMTIME;
  GetFileDateResult: SYSTEMTIME;
begin 
  ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
  CheckFile := CreateFile('FullPathTo\main.pas', GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
  if CheckFile <> INVALID_HANDLE_VALUE then
  begin
    if GetFileTime(CheckFile, @FileTime, nil, nil) then
    begin
      if FileTimeToLocalFileTime(@FileTime, @FileTimeReturn) then
      begin
        if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
          GetFileDateResult := SystemTimeReturn;
      end;
    end;
    CloseHandle(CheckFile);
  end; 
  GetFileDate := GetFileDateResult;
end; 

begin   
  Write(GetFileDate.wYear);   
end.
function GetFileDate : SYSTEMTIME;
var 
  CheckFile: HANDLE; 
  FindFileData: WIN32_FIND_DATA;
  FileTimeReturn: FILETIME; 
  SystemTimeReturn: SYSTEMTIME;
  GetFileDateResult: SYSTEMTIME;
begin 
  ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
  CheckFile := FindFirstFile('FullPathTo\main.pas', @FindFileData);
  if CheckFile <> 0 then
  begin
    if FileTimeToLocalFileTime(@FindFileData.ftCreationTime, @FileTimeReturn) then
    begin
      if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
        GetFileDateResult := SystemTimeReturn;
    end;
    FindClose(CheckFile);
  end; 
  GetFileDate := GetFileDateResult;
end;