|
mac 어드레스를 구하고 싶어서, snmp에 관한 것을 찾아서,
여러 고수님들이 올려주신 소스대로 실행해봤는데, 안되더라고요.
올려놓으신 원래 실행파일은 mac 어드레스 값이 제대로 구해지는데,
소스를 다시 컴파일해서 실행해보면, 값이 안나옵니다.
그냥 단순하게 버튼하나 누르면, mac 어드레스 값을 라벨에 나타내주는 걸 하는데,
제가 워낙 초보라서인지.. 잘 안되네요.
에러도 없고 컴파일도 잘되는데 왜 그럴까요?
여기서 받은 소스를 다시한번 올립니다.
여러 고수님들 도와주세요...
//---------------------------------------------------------------------------
#include <vcl.h>
#include <snmp.h>
#include <dos.h>
#include <stdio.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
String __fastcall TForm1::Unique()
{
typedef BOOL(WINAPI * pSnmpExtensionInit) (
IN DWORD dwTimeZeroReference,
OUT HANDLE * hPollForTrapEvent,
OUT AsnObjectIdentifier * supportedView);
typedef BOOL(WINAPI * pSnmpExtensionTrap) (
OUT AsnObjectIdentifier * enterprise,
OUT AsnInteger * genericTrap,
OUT AsnInteger * specificTrap,
OUT AsnTimeticks * timeStamp,
OUT RFC1157VarBindList * variableBindings);
typedef BOOL(WINAPI * pSnmpExtensionQuery) (
IN BYTE requestType,
IN OUT RFC1157VarBindList * variableBindings,
OUT AsnInteger * errorStatus,
OUT AsnInteger * errorIndex);
typedef BOOL(WINAPI * pSnmpExtensionInitEx) (
OUT AsnObjectIdentifier * supportedView);
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionQuery m_Query;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};
UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};
UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};
AsnObjectIdentifier MIB_ifMACEntAddr =
{ sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr };
AsnObjectIdentifier MIB_ifEntryType =
{sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType};
AsnObjectIdentifier MIB_ifEntryNum =
{sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum};
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = {0, 0};
int ret, dtmp, j = 0;
char TempEthernet[18];
String MAC_ADDRESS = "";
int Count = 0;
String stTString;
char chTString[255];
struct time stTime;
gettime(&stTime);
sprintf(chTString, "%02x%02x%02x%02x", stTime.ti_hour, stTime.ti_min, stTime.ti_sec, stTime.ti_hund);
stTString = chTString;
m_Init = NULL;
m_Query = NULL;
m_hInst = LoadLibrary("inetmib1.dll");
//ShowMessage(m_hInst);
if(m_hInst < (HINSTANCE) HINSTANCE_ERROR) {
m_hInst = NULL;
return("ERROR");
}
m_Init = (pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_Query = (pSnmpExtensionQuery) GetProcAddress(m_hInst, "SnmpExtensionQuery");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL;
varBindList.len = 1;
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret = m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex);
ShowMessage(IntToStr(varBind[0].value.asnValue.number));
varBindList.len = 2;
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);
do {
ret = m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus, &errorIndex);
if(!ret) ret = 1;
else ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType, MIB_ifEntryType.idLength);
if(!ret) {
j++;
dtmp = varBind[0].value.asnValue.number;
if(dtmp == 6) {
ret = SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr, MIB_ifMACEntAddr.idLength);
if((!ret) && (varBind[1].value.asnValue.address.stream != NULL)) {
if((varBind[1].value.asnValue.address.stream[0] == 0x44) &&
(varBind[1].value.asnValue.address.stream[1] == 0x45) &&
(varBind[1].value.asnValue.address.stream[2] == 0x53) &&
(varBind[1].value.asnValue.address.stream[3] == 0x54) &&
(varBind[1].value.asnValue.address.stream[4] == 0x00)) {
continue;
}
if((varBind[1].value.asnValue.address.stream[0] == 0x00) &&
(varBind[1].value.asnValue.address.stream[1] == 0x00) &&
(varBind[1].value.asnValue.address.stream[2] == 0x00) &&
(varBind[1].value.asnValue.address.stream[3] == 0x00) &&
(varBind[1].value.asnValue.address.stream[4] == 0x00) &&
(varBind[1].value.asnValue.address.stream[5] == 0x00)) {
continue;
}
sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
MAC_ADDRESS = (String)TempEthernet;
}
}
}
if(++ Count > 10) break;
} while(!ret);
FreeLibrary(m_hInst);
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
// return(MAC_ADDRESS + stTString);
return(MAC_ADDRESS);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(Unique());
}
//---------------------------------------------------------------------------
|