如何获得 NT 的系统日期及时间(50分)

  • 主题发起人 主题发起人 GaryLou
  • 开始时间 开始时间
G

GaryLou

Unregistered / Unconfirmed
GUEST, unregistred user!
身为 Client 的电脑如何得 NT Server 的系统日期及时间
 
好象是利用某个端口获得.
我查查。
 
<a href="http://www.torry.ru/vcl/lan/ntremotedatetime.zip">NTRemote DateTime</a>:
部分关键代码:
PTime_Of_Day_Info = ^TTime_Of_Day_Info;
TTime_Of_Day_Info = record
tod_elapsedt :Integer;
tod_msecs :Integer;
tod_hours :Integer;
tod_mins :Integer;
tod_secs :Integer;
tod_hunds :Integer;
tod_timezone :LongInt;
tod_tinterval :Integer;
tod_day :Integer;
tod_month :Integer;
tod_year :Integer;
tod_weekday :Integer;
end;

function NetRemoteTOD(ServerName :PWideChar;
var buffer :pointer) :Integer; stdcall; external 'netapi32.dll';

function NetApiBufferFree(buffer : Pointer) :Integer; stdcall; external 'netapi32.dll';

function TNTRemoteDateTime.GetTOD(ServerName: WideString): Integer;
var Buffer :pointer;
Rek :PTime_Of_Day_Info;
ADate :TDateTime;
ATime :TDateTime;
FinalTime :TDateTime;
THours,
TMins,
TSecs,
TMSecs :Word;
TYear,
TMonth,
TDay :Word;
begin

result:=NetRemoteTOD(PWideChar(ServerName),
Buffer);
if result=0 then
begin
Rek:=PTime_Of_Day_Info(Buffer);
FServerName :=ServerName;
FElapseDt :=Rek.tod_elapsedt;
FMSecs :=Rek.tod_msecs;
FHours :=Rek.tod_hours;
FMins :=Rek.tod_mins;
FSecs :=Rek.tod_secs;
FHunds :=Rek.tod_hunds;
FTInterval :=Rek.tod_tinterval;

If Rek.tod_timezone <> -1 then
begin
FTimeZone:=Rek.tod_timezone div 60;
end
else
FTimeZone:=0;

FDay :=Rek.tod_day;
FMonth :=Rek.tod_month;
FYear :=Rek.tod_year;
FWeekDay :=Rek.tod_weekday;

ADate:=EncodeDate(FYear, FMonth, FDay);
ATime:=EnCodeTime(FHours, FMins, FSecs, FHunds);

FinalTime:=StrToDateTime(DateTimeToStr(ADate) + ' ' + TimeToStr(ATime));
FinalTime:=FinalTime - (FTimeZone / 24);

decodetime(FinalTime,THours, TMins,TSecs, TSecs);

FHours:=Integer(THours);

decodeDate(FinalTime,TYear, TMonth,TDay);
FYear:=Integer(TYear);
FMonth:=Integer(TMonth);
FDay:=Integer(TDay);

end;
NetApiBufferFree(Buffer);
end;
 
这个API我曾经用过,好像不行,说找不到"函数入口".
你成功过吗?

可以用net命令代替.
net time //NtServerName /set /yes
 
cAkk这个命令好用!
端口我还没找到.
 
amo:我问的是eyes说的那个api函数是否好用.
net命令应该不是用tcp/ip协议,而是netbeui.
 
Another_eyes的API函数可以用,但只能在
NT下使用,你是否在95下使用?
 
to duz: 你说得太对了!!!!!!!!
我觉得这个函数其实根本没用.只有用net命令.
 
如果不是设定时间就有用了:-)
95下如何用?
 
為了保持時間的一致性﹐取server的time and date 是很重要的。
我一般突省事﹐這樣作(oracle下)﹕
.....
var dMyDate : TdateTime;
....

建立一個query,
sql為﹕select sysdate from dual
execsql獲得的結果給dMyDate即可。代碼很少。
 
实在不行用sql函数getdate()
 
那还不如用net.exe呢, 把本机时间设为server时间后再读取本机时间呗.
设置本机时间与server同步可以用
winexec('command.com /c "net.exe time //remoteserver /set /yes"', SW_SHOWDEFAULT);
 
如果能知道net time的原理就好了,可惜从来没用过netbeui :-(
 
如果用net time, 系统时间有改,但在程序中不会即时自动更新,请试一下
Showmessage(DateToStr(now));
winexec('command.com /c "net.exe time //remoteserver /set /yes"', SW_SHOWDEFAULT);
Showmessage(DateToStr(now));
 
呵呵, 这是因为你winexec还没有执行完呢:-)
加个sleep(1000)在第二个showmessage(datetimetostr(now))前.
 
怎么还没有结束???
 
多人接受答案了。
 
后退
顶部