현재 장비의
서브넷 마스크 값을 구하는 함수가 있는지 ???
아무리 찾아봐도 없는 거 같아서.
그래서 레지스트를 뒤졌는데.
NT같은경우에는 특정한 규칙이 있어서.
장비를 찾고 찾은 장비명의 서비스에 값이 있는데..
Win98같은 경우에는
NetTrans에 저장되어 있긴 한데
그곳에 디바이스 명이.. 0001부터 순차적으로 있습니다.
어떤게 랜카드의 것인지 판별하기가 모호해서...
혹시 그걸 알고 계시다거나...
가장좋은건 함수가 있다면 함수를 좀..
아시는 분좀 부탁 드립니다.
> 현재 장비의
> 서브넷 마스크 값을 구하는 함수가 있는지 ???
> 아무리 찾아봐도 없는 거 같아서.
> 그래서 레지스트를 뒤졌는데.
> NT같은경우에는 특정한 규칙이 있어서.
> 장비를 찾고 찾은 장비명의 서비스에 값이 있는데..
> Win98같은 경우에는
> NetTrans에 저장되어 있긴 한데
> 그곳에 디바이스 명이.. 0001부터 순차적으로 있습니다.
> 어떤게 랜카드의 것인지 판별하기가 모호해서...
> 혹시 그걸 알고 계시다거나...
>
> 가장좋은건 함수가 있다면 함수를 좀..
> 아시는 분좀 부탁 드립니다.
>
안녕하세요~ 구창민입니다.
제가 고수가 아니다 보니, 그런 함수는 모르겠네요.
하지만, 알아낼 방법이 없는건 아닙니다.
아래처럼 Command 에서 'IpConfig /all'을 실행시키고
그 즉시 파이프로 받아내어 메모장으로 옮기는 작업을 테스트해보았습니다.
그리고, 아래의 RunDosCommand는 뉴스그룹에서 본 함수인데 제가 좀 수정했구요,
UsingWinNT 함수는 없어서 제가 만든것인데 이렇게 만들어
사용해야 하는지는 정확치 않구요 제가 추측한겁니다.
하지만, 일단 자알 됩니다.
좀 수정하셔서 필요로 하시는 서브넷마스크만 알아내시고 나머지는
사용안하시면 되겠네요.
테스트 하시기전에 먼저 폼위에 TMemo, TButton 컴포넌트를 하나씩
올리고, 아래 두개의 함수를 붙여넣기 붙여넣으신 다음, 가장아래에 있는
사용법을 ButtonClick 이벤트 핸들러에 기술하세요.
그럼~ 참고하셔서 즐거운 프로그래밍 하시길~
function UsingWinNT: Boolean;
var
OS: TOSVersionInfo;
begin
OS.dwOSVersionInfoSize := Sizeof(OS);
GetVersionEx(OS);
if OS.dwPlatformId = VER_PLATFORM_WIN32_NT then Result:= True
else Result:= False;
end;
procedure RunDosCommand(Command : string; Output : TStringList);
var
hReadPipe : THandle;
hWritePipe : THandle;
SI : TStartUpInfo;
PI : TProcessInformation;
SA : TSecurityAttributes;
SD : TSecurityDescriptor;
BytesRead : DWORD;
Dest : array[0..1023] of char;
CmdLine : array[0..512] of char;
TmpList : TStringList;
S, Param : string;
Avail, ExitCode, wrResult : DWORD;
begin
if UsingWinNT then
begin
InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@SD, True, nil, False);
SA.nLength := SizeOf(SA);
SA.lpSecurityDescriptor := @SD;
SA.bInheritHandle := True;
CreatePipe(hReadPipe, hWritePipe, @SA, 1024);
end
else
CreatePipe(hReadPipe, hWritePipe, nil, 1024);
try
Screen.Cursor := crHourglass;
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(TStartUpInfo);
SI.wShowWindow := SW_HIDE;
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
SI.hStdOutput := hWritePipe;
SI.hStdError := hWritePipe;
StrPCopy(CmdLine, Command);
if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
begin
ExitCode := 0;
while ExitCode = 0 do
begin
wrResult := WaitForSingleObject(PI.hProcess, 500);
if PeekNamedPipe(hReadPipe, nil, 0, nil, @Avail, nil) then
begin
if Avail > 0 then
begin
TmpList := TStringList.Create;
try
FillChar(Dest, SizeOf(Dest), 0);
ReadFile(hReadPipe, Dest, Avail, BytesRead, nil);
Form1.Memo1.Lines.Add(Dest);
finally
TmpList.Free;
end;
end;
end;
if wrResult <> WAIT_TIMEOUT then
ExitCode := 1;
end;
GetExitCodeProcess(PI.hProcess, ExitCode);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
finally
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
Screen.Cursor := crDefault;
end;
end;
//사용법
procedure TForm1.Button1Click(Sender: TObject);
var S: TStringList;
begin
Memo1.Clear;
//Current PC의 현재 네트웍 상태가 Memo1에 나타나게 하는 테스트 코드입니다.
//그리고, ipconfig 명령뿐 아니라
//Command 에 사용할수 있는 모든 명령어는 다 사용할수 있습니다.
RunDosCommand('ipconfig /all', S);
end;