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 최종패치 적용한 상태 입니다.
로 하면 결과는 아무 값도 없고..
|