Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[9818] IP HELP API 사용해보신분 계신가요?
박진수 [] 1725 읽음    2004-08-24 19:23
IP HELP API(IPHLPAPI.DLL 에 있음)를 이용하여.
랜카드에 대한
MAC ADDRESS 및 IP ADDRESS, 게이트웨이 어드레스, DHCP 유무의정보를 읽어 오려고 하는데요.

제가 실수 한게 있는지 잘 되질 않네요.

일단 소스를 올려놓겠습니다.  테스트 중입니다.

-------------------------------------------------------------------------

const
     MAX_ADAPTER_ADDRESS_LENGTH = 8;  // Adapter(랜카드) MAC Address 주소의 최대길이(BYTE 수)
     MAX_ADAPTER_NAME_LENGTH = 256;  // Adapter(랜카드) 네임처리를 위한 최대길이(BYTE 수)
     MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // Adapter(랜카드) 설명처리를 위한 최대길이(BYTE 수)

type
  TMacAddress = array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; // MAC Address 처리를 위한 Type정의

type
  PTIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING; // IP Address 처리를 위한 Type Pointer Type의 정의
  TIP_ADDRESS_STRING = array[0..15] of char;  // IP Address 처리를 위한 Type의 정의

type
  PTIP_ADDR_STRING = ^TIP_ADDR_STRING; // IP Address 리스트 Type을 처리위한 구조체 Type에 대한 Pointer Type의 정의
  TIP_ADDR_STRING = packed record  // IP Address 리스트 Type을 처리위한 구조체 Type 정의(Linked List)
     Next: PTIP_ADDR_STRING;  // 다음 IP Address 정보를 가리키는 Pointer
     IpAddress: TIP_ADDRESS_STRING; // IP Address 주소
     IpMask: TIP_ADDRESS_STRING;   // IP Mask 값
     Context: DWORD;              // Context ID
  end;

type
  TTIME_T = array[1..325] of byte;  // Lease Obtained Time(DHCP서버로 부터 IP를 임대시작한 시간)
                                    // 또는 Lease Expires Time(DHCP서버로 부터 IP를 임대말료 시간)의 처리를 위한 Type 정의
  PTIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;
  TIP_ADAPTER_INFO = packed record  // Network Adapter 정보 처리를 위한 Type 정의 ipconfig.exe를 실행시 나타내주는 구조와 비슷(Linked List)
     Next: PTIP_ADAPTER_INFO; // 다음 Network Adapter 정보로의 Pointer
     ComboIndex: DWORD; // winipcfg 상태에서의 콤보박스 저장 인덱스
     AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char; // 어뎁터명
     Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char; // 어뎁터에 대한 설명
     AddressLength: UINT;  // 어드레스의 길이  UNIT = LongWord
     Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; // 어뎁터의 MAC 어드레스 주소
     Index: DWORD;
     aType: UINT;
     DHCPEnabled: UINT; // DHCP 사용여부
     CurrentIPAddress: PTIP_ADDR_STRING; // 어뎁터의 IP 어드레스 주소
     IPAddressList: TIP_ADDR_STRING; // DNS 서버 IP 리스트
     GatewayList: TIP_ADDR_STRING;  // GateWay IP 리스트
     DHCPServer: TIP_ADDR_STRING;  // DHCP 서버 IP 리스트
     HaveWINS: BOOL;   // WINS 서버 사용여부
     PrimaryWINSServer: TIP_ADDR_STRING;   // 주 WINS 서버에 대한 IP 어드레스
     SecondaryWINSServer: TIP_ADDR_STRING; // 보조 WINS 서버에 대한 IP 어드레스
     LeaseObtained: TTIME_T; // Lease Obtained Time(DHCP서버로 부터 IP를 임대시작한 시간) = 회선사용시작시간
     LeaseExpires: TTIME_T; // Lease Expires Time(DHCP서버로 부터 IP를 임대말료 시간) = 회선사용종료시간
  end;

function GetAdaptersInfo(AdapterInfo: PTIP_ADAPTER_INFO; OutBufLen: PULONG): DWORD;
stdcall; external 'IPHLPAPI.DLL';


function GetMacAddress(AdapterID: integer): string;
var
   Error, BufLen : DWORD;
   AdapterInfo : PTIP_ADAPTER_INFO;
   Descr : string;
begin
     Result := '';
     BufLen := SizeOf(AdapterInfo^);
     New(AdapterInfo);
     //-----
     Error := GetAdaptersInfo(AdapterInfo, @BufLen);
     if(Error = NO_ERROR) then // 에러가 없다면..,
     begin
          while(AdapterInfo <> nil) do
          begin
               descr := string(AdapterInfo^.Description);
               showmessage(descr);
               AdapterInfo := AdapterInfo^.Next;
          end;
     end
     else Result := SysErrorMessage(Error);
     Dispose(AdapterInfo);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
     GetMacAddress(0);
end;

-------------------------------------------------

일단 제가 IP_ADAPTER_INFO 에 대한 구조체 내용은 대강 분석해 놨는데요.. 주석기준으로
읽어오는 값들중..,  

어뎁터의 이름을 읽어오기위해
descr := string(AdapterInfo^.AdapterName);  로 하면 결과는 아무 값도 없고..
어뎁터의 ip주소를 읽어오기위해
descr := string(AdapterInfo^.CurrentIPAddress^.IpAddress); 나
descr := string(AdapterInfo^.IPAddressList.IpAddress); 를 해도 아무런 내용이 없더군요.

어뎁터 명은 오히려
descr := string(AdapterInfo^.AdapterName); 대신
descr := string(AdapterInfo^.Description); 을 사용해야 읽어와 지는데..,

정확한 제어방법을 아시는 분들의 조언을 구합니다.

-----------------------------------------------

작업환경은 델파이 7 패치1 적용상태구요.
win98se  ie6.0 sp1 최종패치 적용한 상태 입니다.


  로 하면 결과는 아무 값도 없고..

+ -

관련 글 리스트
9818 IP HELP API 사용해보신분 계신가요? 박진수 1725 2004/08/24
9819     Re:IP HELP API 사용해보신분 계신가요? civilian 1364 2004/08/24
9820         Re:IP HELP API 사용해보신분 계신가요? 박진수 1289 2004/08/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.