NTPを使用しないで、他のマシン(サーバー)から時刻を
取得(DOSコマンドのNET TIMEのような)できないでしょうか?
レスが付かないようですので...
もし、http関連のコンポーネントや関数等が利用できれば以下の
http/GETリクエストでサーバーアクセス時間が取れると思います。
【送信】
GET / HTTP/1.0\r\nHost: www.hogehoge.com\r\n\r\n
【受信例】
HTTP/1.1 200 OK Date: Thu, 27 Sep 2007 03:25:11 GMT Server: Apache/2.0.59 (Win32) PHP/5.2.0 X-Powered-By: PHP/5.2.0 Connection: close Content-Type: text/html
サーバーなどの環境で表示内容は変わりますので注意。
(この日時はあまり利用した事がないので、詳細は未調査です)
補足..
サーバーが、LANの共有サーバーだったら、上では無理です。
(WEBサーバーの場合ですね)
真琴:「ハルコさん、どうしてもウマクいかないんだけど…」
春子:「ン?なにが?」
真琴:「これ…、Edit1に相手のコンピュータ名を入れてボタン押すと、Memo1に時刻が出るはずなのに…」
procedure TForm1.Button1Click(Sender: TObject);
const
BUFFER_SIZE = $1000;
var
hReadPipe, hWritePipe: THandle;
SA: TSecurityAttributes;
SD: TSecurityDescriptor;
SI: TStartupInfo;
PI: TProcessInformation;
dwStdOut, dwRet: DWORD;
aBuffer: array[0..BUFFER_SIZE] of Byte;
sCmd: string;
msStdOut: TStream;
begin
SetLength(sCmd, 300);
ZeroMemory(@SA, Sizeof(TSecurityAttributes));
with SA do begin
nLength := Sizeof(TSecurityAttributes);
bInheritHandle := True;
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@SD, True, nil, False);
lpSecurityDescriptor := @SD;
GetSystemDirectory(PChar(sCmd), 255);
sCmd := PChar(sCmd) +'\Cmd.exe /C NET TIME \\'+ Edit1.Text;
end else begin
lpSecurityDescriptor := nil;
GetWindowsDirectory(PChar(sCmd), 255);
sCmd := PChar(sCmd) +'\Command.com /C NET TIME \\'+ Edit1.Text;
end;
end;
msStdOut := TMemoryStream.Create;
CreatePipe(hReadPipe, hWritePipe, @SA, BUFFER_SIZE);
try
ZeroMemory(@SI, Sizeof(TStartupInfo));
with SI do begin
cb := Sizeof(TStartupInfo);
dwFlags := STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdOutput := hWritePipe;
end;
Application.ProcessMessages;
if CreateProcess(nil, PChar(sCmd), @SA, nil, True, DETACHED_PROCESS,
nil, nil, SI, PI) then begin
try
repeat
dwRet := WaitForSingleObject(PI.hProcess, 100);
PeekNamedPipe(hReadPipe, nil, 0, nil, @dwStdOut, nil);
if (dwStdOut > 0) then begin
ReadFile(hReadPipe, aBuffer, dwStdOut, dwStdOut, nil);
msStdOut.Write(aBuffer, dwStdOut);
end;
until (dwRet = WAIT_OBJECT_0);
GetExitCodeProcess(PI.hProcess, dwRet);
finally
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end else raise Exception.Create('CreateProcess 失敗!');
msStdOut.Position := 0;
Memo1.Lines.LoadFromStream(msStdOut);
finally
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
msStdOut.Free;
end;
end;
春子:「ン?…あ〜ぁ、ナルホド、"NET TIME"コマンドをDelphiのプログラムで実行するのネ」
真琴:「そうなの、アタシのパソコンでコレ実行した場合は、こっちのWinXPパソコンの時刻が見れるんだけど…」
春子:「マコトの部屋のパソコンは、OS、ナニ?」
真琴:「まだ、Win98…」
春子:「古ぅ〜」
真琴:「そう、おじいちゃんが前に使ってた、お古のパソコン。…だけど、形見と思って大切にしてるの」
春子:「そっか、ゴメンゴメン」
真琴:「Win98ならこの方法で ちゃんとMemo1に相手の時刻が表示されるの、でも…」
春子:「WinXPでこのプログラム実行すると、DOS窓が一瞬出るだけで、Memo1には何も表示されないよね」
真琴:「だけど、XPでもコマンドプロンプトで"NET TIME \\..."を実行するとOKなのに…、なんで?」
春子:「Win98とWinXPでは、同じNET.EXEでも中身がチョット違うみたいね、だからXPではダメなんだよ」
真琴:「もう、どうしたらイイんだろぅ…XPではムリなの?」
春子:「マコト…、じゃぁ、プログラムのココをこう変えてみたら?」
・……
// sCmd := PChar(sCmd) +'\Cmd.exe /C NET TIME \\'+ Edit1.Text;
sCmd := PChar(sCmd) +'\Net1.exe TIME \\'+ Edit1.Text;
・……
真琴:「あっ、これならMemo1にアタシの部屋のパソコンの時刻が表示されたヨ、でもハルコさん、Net1.exeって…」
春子:「NT系のNet.exeは、Net1.exeを呼び出してるみたいなんだ…それでネ」
真琴:「ふ〜ん、そぅいうことなんだぁ…」
春子:「アタシも そこんトコ詳しくは知らないけどネ」
ツイート | ![]() |