Q&A

  • 현재 장비의 Subnet Mask를 구하는 방법?
현재 장비의

서브넷 마스크 값을 구하는 함수가 있는지 ???

아무리 찾아봐도 없는 거 같아서.

그래서 레지스트를 뒤졌는데.

NT같은경우에는 특정한 규칙이 있어서.

장비를 찾고 찾은 장비명의 서비스에 값이 있는데..

Win98같은 경우에는

NetTrans에 저장되어 있긴 한데

그곳에 디바이스 명이.. 0001부터 순차적으로 있습니다.

어떤게 랜카드의 것인지 판별하기가 모호해서...

혹시 그걸 알고 계시다거나...



가장좋은건 함수가 있다면 함수를 좀..

아시는 분좀 부탁 드립니다.



1  COMMENTS
  • Profile
    구창민 2000.06.21 23:23
    급한이 wrote:

    > 현재 장비의

    > 서브넷 마스크 값을 구하는 함수가 있는지 ???

    > 아무리 찾아봐도 없는 거 같아서.

    > 그래서 레지스트를 뒤졌는데.

    > 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;