Pascal:从 LPSYSTEMTIME 记录中获取字段 [英] Pascal: Get field from LPSYSTEMTIME record

查看:51
本文介绍了Pascal:从 LPSYSTEMTIME 记录中获取字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我有一个函数 (GetFileDate):

函数 GetFileDate : LPSYSTEMTIME无功检查文件:长;文件时间:LPFILETIME;文件时间返回:LPFILETIME;SystemTimeReturn: LPSYSTEMTIME;开始CheckFile := CreateFile(PChar('main.pas'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);GetFileTime(CheckFile, FileTime, NIL, NIL);FileTimeToLocalFileTime(FileTime, FileTimeReturn);FileTimeToSystemTime(FileTimeReturn, SystemTimeReturn);GetFileDate := SystemTimeReturn;结尾;

但是当我这样做时...

开始写(GetFileDate.wYear);结尾.

它吐了

<块引用>

main.pas(22,20) 错误:非法限定符main.pas(22,20) 致命:语法错误,)"预期但标识符 WYEAR"找到致命:编译中止

对此有什么帮助吗?

解决方案

LPSYSTEMTIME 是一个指向 SYSTEMTIME 结构的指针.尝试使用 ^ 运算符取消引用该指针,例如:

Write(GetFileDate^.wYear);

或者:

Write(GetFileDate()^.wYear);

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

试试这个:

函数 GetFileDate : SYSTEMTIME;无功检查文件:处理;文件时间:文件时间;文件时间返回:文件时间;SystemTimeReturn: SYSTEMTIME;获取文件日期结果:系统时间;开始ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));CheckFile := CreateFile('FullPathTo\main.pas', GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);如果 CheckFile <>INVALID_HANDLE_VALUE 然后开始如果 GetFileTime(CheckFile, @FileTime, nil, nil) 然后开始如果 FileTimeToLocalFileTime(@FileTime, @FileTimeReturn) 那么开始如果 FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) 那么GetFileDateResult := SystemTimeReturn;结尾;结尾;关闭句柄(检查文件);结尾;GetFileDate := GetFileDateResult;结尾;开始写(GetFileDate.wYear);结尾.

或者,我建议使用 FindFirstFile() 而不是 CreateFile(),这样您就不必为了获取日期而打开文件.文件系统可以提供该信息,例如:

函数 GetFileDate : SYSTEMTIME;无功检查文件:处理;FindFileData: WIN32_FIND_DATA;文件时间返回:文件时间;SystemTimeReturn: SYSTEMTIME;获取文件日期结果:系统时间;开始ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));CheckFile := FindFirstFile('FullPathTo\main.pas', @FindFileData);如果 CheckFile <>0 那么开始如果 FileTimeToLocalFileTime(@FindFileData.ftCreationTime, @FileTimeReturn) 然后开始如果 FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) 那么GetFileDateResult := SystemTimeReturn;结尾;FindClose(CheckFile);结尾;GetFileDate := GetFileDateResult;结尾;

I'm using the Win32 api to get date and time of a file. I have a LPSYSTEMTIME structure, and I'm trying to print its wYear variable.

I've got a function (GetFileDate):

function GetFileDate : LPSYSTEMTIME
var
    CheckFile: Long;
    FileTime: LPFILETIME;
    FileTimeReturn: LPFILETIME;
    SystemTimeReturn: LPSYSTEMTIME;
begin
    CheckFile := CreateFile(PChar('main.pas'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    GetFileTime(CheckFile, FileTime, NIL, NIL);
    FileTimeToLocalFileTime(FileTime, FileTimeReturn);
    FileTimeToSystemTime(FileTimeReturn, SystemTimeReturn);
    GetFileDate := SystemTimeReturn;
end;

But when I do this...

begin
    Write(GetFileDate.wYear);
end.

It spits back

main.pas(22,20) Error: Illegal qualifier
main.pas(22,20) Fatal: Syntax error, ")" expected but "identifier WYEAR" found
Fatal: Compilation aborted

Any help on this?

解决方案

LPSYSTEMTIME is a pointer to a SYSTEMTIME structure. Try using the ^ operator to dereference that pointer, eg:

Write(GetFileDate^.wYear);

Or:

Write(GetFileDate()^.wYear);

With that said, aside from the fact that you are not doing any error handling at all, your GetFileDate() implementation is passing the wrong parameter values to the various API functions. That code should not even compile, let alone run correctly.

Try this instead:

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.

Alternatively, I would suggest using FindFirstFile() instead of CreateFile() so you do not have to open the file just to get its date. The filesystem can supply that information, eg:

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; 

这篇关于Pascal:从 LPSYSTEMTIME 记录中获取字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆