Q&A

  • 다시 한번 글 올립니다...ㅡ,.ㅜ
아래에 글을 적었는데 원하는 답변이 없어서요... 쩝..

로컬 피시에 전체 Mac Address 정보를 알아낼 수 없을까요?

유, 무선, 인터넷 연결이 상태 무관하게요~~~

도와주세요요요요오오옹~~~
4  COMMENTS
  • Profile
    구창민 2010.04.30 18:28
    안녕하세요..

    아침에 급조해서 만들어봤습니다.. Delphi2010 으로 구현했되었구요..

    현재 LocalPC 에 존재하는 IP 목록을 구한후 차례로 MacAddress 를 구해내는 코드입니다.

    즐거운 프로그래밍 하세요..^^

    uses
    WinSock;

    {$R *.dfm}



    function SendARP(DestIP:ULONG; SrcIP:DWORD; PMacAddr:PULONG; PhyAddrLen:PULONG): DWORD; StdCall;
    external 'iphlpapi.dll' name 'SendARP';


    function LocalIPList: TStringList;
    type
    TaPInAddr = array[0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
    var
    phe: PHostEnt;
    pptr: PaPInAddr;
    Buffer: array[0..63] of AnsiChar;
    I: Integer;
    WSAData: TWSAData;
    begin
    WSAStartup(MakeWord(2, 2), WSAData);
    Result := TStringList.Create;
    Result.Clear;
    GetHostName(Buffer, SizeOf(Buffer));
    phe := GetHostByName(buffer);
    if phe = nil then Exit;
    pPtr := PaPInAddr(phe^.h_addr_list);
    I := 0;
    while pPtr^[I] <> nil do
    begin
    Result.Add(string(inet_ntoa(pptr^[I]^)));
    Inc(I);
    end;
    WSACleanUp;
    end;

    function GetMacAddress(IpAddress: string): string;
    var
    DestIP: ULONG;
    MacAddr: Array [0..5] of Byte;
    MacAddrLen: ULONG;
    begin
    DestIP := inet_addr(PAnsiChar(AnsiString(IPAddress)));
    MacAddrLen := Length(MacAddr);
    SendARP(DestIP, 0, @MacAddr, @MacAddrLen);
    Result := Format('%s (MAC): %2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X',
    [IpAddress, MacAddr[0], MacAddr[1], MacAddr[2],
    MacAddr[3], MacAddr[4], MacAddr[5]]);
    end;

    procedure TForm21.Button1Click(Sender: TObject);
    var
    i : integer;
    IPAddressList: TStringList;
    begin
    IPAddressList := LocalIPList;
    try
    for i := 0 to IpAddressList.Count -1 do
    ShowMessage(GetMacAddress(IpAddressList[i]));
    except
    on E:Exception do
    ShowMessage(E.Message);
    end;
    end;
  • Profile
    땅쿠 2010.04.30 20:02
    감솨합니다.. 뚝딱 만들어내는 실력이 부러울 따름입니다....

    감사히 잘 활용하겠습니다.
  • Profile
    구창민 2010.05.01 01:08
    땅쿠님 .. 쪽지로 질의를 보내시면 대부분은 답변을 안주십니다...앞으론 쪽지로 주지 마시구요..

    질답은 공유되어야 추후 검색자료로도 사용되구요...

    문의 주신 질문에 부합되는 코드를 만들려면.. 아무래도 젤 손쉬운 방법은 도스출력을 리다이렉션 하는 방법이

    젤 편할거 같습니다. 결과를 가공하셔서 쓰시구요..

    아래 그 예제를 퍼다 드립니다.

    아마 오래전에 영대님이 팁게에 올리셨던거 같네요..


    // 읽고 쓰기 파이프 핸들
    type
    TPipeHandles=record
    hRead, hWrite: DWORD;
    end;







    // 실행한 도스 명령어의 결과값을 반환
    function GetDosOutput(cmd: String): String;
    const BUFFER_SIZE=4096;



    // 넘겨받은 핸들을 닫아줌 ____________________________________________________
    procedure ClosePipe(var Pipe: TPipeHandles);
    begin
    with Pipe do begin
    if hRead<>0 then CloseHandle(hRead);
    if hWrite<>0 then CloseHandle(hWrite);
    hRead:=0;
    hWrite:=0;
    end;
    end;


    // 파이프에서 읽어온 정보를 Result 에 저장 ___________________________________
    procedure ReadPipe(var Pipe: TPipeHandles);
    var
    ReadBuf: array [0..BUFFER_SIZE] of Char;
    BytesRead: DWORD;
    begin
    // 파이프에 읽을 데이터가 있는지 검사
    if PeekNamedPipe(pipe.hRead, nil, 0, nil, @BytesRead, nil) and (BytesRead>0)
    then begin
    ReadFile(pipe.hRead, ReadBuf, BytesRead, BytesRead, nil);
    if BytesRead>0 then begin
    ReadBuf[BytesRead]:=#0;
    Result:=ReadBuf;
    end;
    end;
    end;
    // ___________________________________________________________________________


    var
    ProcessInfo: TProcessInformation;
    StartupInfo: TStartupInfo;
    SecAttr: TSecurityAttributes;
    PipeStdOut: TPipeHandles;
    PipeStdErr: TPipeHandles;
    dwExitCode: DWORD;



    begin
    SecAttr.nLength:=SizeOf(SecAttr);
    SecAttr.lpSecurityDescriptor:=nil;
    SecAttr.bInheritHandle:=True;



    // STDOUT 파이프 생성
    with PipeStdOut do // 표준 출력(stdout) 파이프
    if not CreatePipe(hRead, hWrite, @SecAttr, BUFFER_SIZE) then ShowMessage('STDOUT pipe 를 만들 수 없습니다.');



    try
    // STDERR 파이프 생성
    with PipeStdErr do // 표준 에러(stderr) 파이프
    if not CreatePipe(hRead, hWrite, @SecAttr, BUFFER_SIZE) then ShowMessage('STDERR pipe 를 만들 수 없습니다.');
    except
    ClosePipe(PipeStdOut);
    raise;
    Exit;
    end;



    try
    FillChar(StartupInfo, SizeOf(StartupInfo), 0);
    with StartupInfo do begin
    cb:=SizeOf(StartupInfo);
    dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    // 표준출력 and 표준에러 스트림에 생성한 파이프를 연결
    hStdOutput:=PipeStdOut.hWrite;
    hStdError:=PipeStdErr.hWrite;
    wShowWindow:=SW_HIDE;
    end;



    // 도스 명령어 실행
    if CreateProcess(
    nil, PChar(Cmd), @SecAttr, @SecAttr, True,
    DETACHED_PROCESS or NORMAL_PRIORITY_CLASS,
    nil, nil,
    StartupInfo, ProcessInfo
    )
    then begin
    dwExitCode:=STILL_ACTIVE;
    Screen.Cursor:=crHourglass;
    try
    repeat
    // 실행완료까지 기다림
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, dwExitCode);



    Application.ProcessMessages;



    // 실행완료후 결과값을 파이프에서 읽어옴
    ReadPipe(PipeStdOut);
    ReadPipe(PipeStdErr);
    until dwExitCode<>STILL_ACTIVE; // 아직 실행중이면 반복



    if not GetExitCodeProcess(ProcessInfo.hProcess, dwExitCode) then ShowMessage('Exit Code 를 읽어올 수 없습니다.');



    if dwExitCode<>0 then // 정상종료가 아니면
    raise Exception.Create('Exit Code '+IntToStr(dwExitCode));
    finally
    Screen.Cursor:=crDefault;
    if dwExitCode=STILL_ACTIVE then TerminateProcess(ProcessInfo.hProcess, 1);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    ProcessInfo.hProcess:=0;
    end;
    end
    else ShowMessage(Cmd+' 명령어 실행을 위한 프로세스 생성 실패');
    finally
    ClosePipe(PipeStdOut);
    ClosePipe(PipeStdErr);
    end;
    end;

















    procedure TForm1.Button1Click(Sender: TObject);
    var
    s: String;
    sList, tList: TStringList;
    i: Integer;


    begin
    sList:=TStringList.Create;
    tList:=TStringList.Create;
    try

    s:=GetDosOutput('ipconfig /all');

    ExtractStrings([#13],[],PChar(s),sList);

    Memo1.Clear;


    for i:=0 to sList.Count - 1 do begin
    // 맥어드레스는 Physical Address 라는 항목에 있음
    if Pos('Physical Address', sList[i])>0 then begin
    tList.Clear;
    // ':' 로 나눈 뒤에 것이 MAC Address
    ExtractStrings([':'], [], PChar(sList[i]), tList);
    Memo1.Lines.Add(Trim(tList[1]));
    end;
    end;

    finally
    FreeAndNil(tList);
    FreeAndNil(sList);
    end;
    end;


  • Profile
    땅쿠 2010.05.01 03:28
    감솨합니당...
    그냥 질답에 올리면 못 보실까봐 쪽지로 보내게 되었습니다...
    • phono
      2010.04.30 21:33
      qrDBTEXT, QRLABEL 모두 그런가요? 그리고 해당 컨트롤의 AUTOSIZE = fALSE로 하시고 정렬기준을 ...
    • 박준영
      2010.05.10 22:31
      phono 님 qrDBTEXT, QRLABEL 둘다 같고요... ㅠ.ㅠ AUTOSIZE = fALSE 이건 해보니.. 문제가 없네요.. ...
    • 땅쿠
    • 2010.04.30 00:49
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2010.04.30 18:28
      안녕하세요.. 아침에 급조해서 만들어봤습니다.. Delphi2010 으로 구현했되었구요.. 현재 LocalPC 에...
    • 땅쿠
      2010.04.30 20:02
      감솨합니다.. 뚝딱 만들어내는 실력이 부러울 따름입니다.... 감사히 잘 활용하겠습니다.
    • 구창민
      2010.05.01 01:08
      땅쿠님 .. 쪽지로 질의를 보내시면 대부분은 답변을 안주십니다...앞으론 쪽지로 주지 마시구요.. 질...
    • 땅쿠
      2010.05.01 03:28
      감솨합니당... 그냥 질답에 올리면 못 보실까봐 쪽지로 보내게 되었습니다...
    • 박경남
    • 2010.04.29 23:20
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 인생무상
      2010.04.30 00:22
      헐.... function T_form1F.egubn(var s:string):string ; //76번째줄 --> function TFo...
    • 이용벽
      2010.04.30 00:29
      추가해서 또 하나 function T_form1F.egubn(var s:string):string ; //76번째줄 begin case...
    • 하앍
      2010.05.01 01:56
      답변 감사드립니다^^
    • 땅쿠
    • 2010.04.29 18:31
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 정경철
      2010.04.29 19:37
      팁 란에 검색 하시면 MAC Address 구하는 방법이 나와 있습니다.
    • 땅쿠
      2010.04.29 19:51
      먼저 답변 감사드리구요. 제 질문은 위에 3가지를 모두 해결할 수 있는 방법이 궁금한겁니다. 혹 팁란...
    • phono
      2010.04.30 21:36
      IPhelpapi.dll을 라이브러리화 한게 델파이 사이트에 있을겁니다. 그걸 가지고 처리 하면 될듯 하고요...
    • 땅쿠
      2010.05.01 00:52
      phono 님 해당 답글 이제서야 봤네요... 감사합니다.
    • 정경철
      2010.04.29 19:36
      파라독스 로컬을 사용하면 생기는 파일 입니다. 제어판에 BDE 설정이 있는데 그곳에서 설정을 하면 자동...
    • 신태섭
      2010.08.21 07:43
      델파이 프로그램 실행하실때 마우스 우클릭하셔서 관리자모드로 실행하시면 됩니다. C:\에 파일을 만들...
    • GGL
      2010.04.28 08:50
      기억이 가물가물 .....idhttp 컴포=> request==>useragent 항목검색
    • 한원희
      2010.04.29 00:10
      제 생각에는 한글로 써질 부분을 AnsiString로 변환한 후에, URLEncoding해주면 될듯. 아니면, asp를 UT...
    • 윤영훈
      2010.04.29 21:19
      답변 감사드립니다. GGL 님이 답변주신 내용으로 검색하여 찾아봤는데 원하는 내용이 나오지 않았지만...
    • 이재신
    • 2010.04.27 23:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.04.29 01:56
      설치된 TrayIcon컴포넌트가 tanttaskbaricon인지 확인해보세요. Environment Options던가 Project Opti...
    • 땅콩맨
      2010.04.28 02:44
      C#에도 sendbuffer라는 함수가 존재합니다. 형식만 맞춰주면되는데... @를 어떻게 바꿔야할지만 알면 되...
    • 박준영
      2010.04.27 19:22
      앗... 입력제한 이렇게 검색하면 않나오던 것들이 입력 제한 이렇게 검색하니... 많은 답변이 나오네요....
    • 땅콩맨
      2010.04.28 02:37
      진정한 검색을 터득하셨군요? ㅋㅋ
    • 백록화
      2010.04.27 21:46
      델파이로는 안돼고...Free Pascal / Lazarus 로는 개발들 하시는거 같던데요.. (델마당에 Lazarus 게시판...
    • 델초보
      2010.05.03 17:38
      델파이 프리즘으로 개발은 안되나요?........
    • 백록화
      2010.05.03 19:31
      PDA에 닷넷 플랫폼을 올리면...프리즘으로 가능하..겟죠?
    • 허진영
    • 2010.04.26 23:50
    • 2 COMMENTS
    • /
    • 0 LIKES
    • isul
      2010.04.27 01:40
      Math.Mean(const Data: array of Double)으로 선언되어 있습니다. 동적 배열을 넣어도 정상 동작됩니다.
    • 허진영
      2010.04.27 07:44
      답변감사합니다. 그런데 제가 글을 쓴것처럼 에러가 나네요. 제가 언뜻생각한건 형변환이였구요. ...
    • 아이오
      2010.05.10 20:07
      자답 : 웬지는 모르겠지만 제가 mysql table 명을 대문자로 했더니 인식을 못하더군요... 테이블명 소...
    • 김영훈
    • 2010.04.26 22:56
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 권익수
      2010.04.27 14:12
      "TRichEdit"를 사용해보세요. "ScrollBars" 옵션을 "ssBoth"로 설정하고, "HideScrollBars" 옵션을 "Tr...
    • 김영훈
      2010.04.29 18:49
      컴포넌트를 잘 몰라서 한참 헤맸었는데.. 감사합니다 ^^ㅋ
    • 유영택
    • 2010.04.26 18:33
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.26 22:17
      gpl라이센스에 동의한다면 상용으로 사용해도 무관합니다. 그리고 만들어진 소프트웨어는 암묵적으로는...
    • 이종탁
      2010.04.26 23:13
      mysql은 GPL과 상용 라이센스 두가지가 있고 상용 프로그램은 상용 라이센스를 구입해야 합니다. 그리...
    • 땅콩맨
      2010.04.27 12:19
      아, 소스를 공개해야 되는거에요?
    • 김상철
    • 2010.04.26 04:50
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 한규호
    • 2010.04.24 19:57
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.04.26 02:11
      C의 Union과 같습니다. 다만 제약사항으로는 맨 마지막에 위치해야 된다는것빼고는 같아요...
    • 한규호
      2010.05.01 07:01
      아 C의 Union 과 같나요? 모습이 많이 달라 보여서 긴가. 민가 했는데 그렇군요~~^^ 답변 감사합니다.^^