掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
サーバーから時刻の取得 (ID:27867)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
真琴:「ハルコさん、どうしてもウマクいかないんだけど…」 春子:「ン?なにが?」 真琴:「これ…、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を呼び出してるみたいなんだ…それでネ」 真琴:「ふ〜ん、そぅいうことなんだぁ…」 春子:「アタシも そこんトコ詳しくは知らないけどネ」
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.