以下是我写的C++代码,原理是一样的
//getmac.cpp
//取得连接方MAC地址//需要链接netapi32.lib #include "stdafx.h"
#include "mystd.h"#include "nb30.h"//取得MAC地址
STATE getmac(char * ip,UCHAR * mac,int maclen,char * machname,int machnamelen)
{
char ncb_buffer[sizeof(ADAPTER_STATUS)+256*sizeof(NAME_BUFFER)];
UCHAR ret;
NCB ncb;
ADAPTER_STATUS * adapter_status;
NAME_BUFFER * name_buffer; if(maclen<6||machnamelen<16)
{
return -1;
} memset(&ncb,0,sizeof(NCB)); adapter_status=(ADAPTER_STATUS *)ncb_buffer;
name_buffer=(NAME_BUFFER *)(ncb_buffer+sizeof(ADAPTER_STATUS));
ncb.ncb_lana_num=0;
ncb.ncb_lsn=0;
ncb.ncb_num=0;
ncb.ncb_command=NCBRESET;
// if(NRC_GOODRET!=(ret=Netbios(&ncb)))
{
// return -2;
} memset((char *)ncb.ncb_callname,' ',15);
ncb.ncb_callname[15]='\0';
memcpy((char *)ncb.ncb_callname,ip,strlen(ip));
ncb.ncb_buffer=(unsigned char *)ncb_buffer;
ncb.ncb_length=sizeof(ADAPTER_STATUS)+256*sizeof(NAME_BUFFER);
ncb.ncb_lana_num=0; name_buffer->name[0]='\0'; ncb.ncb_command=NCBASTAT;
if(NRC_GOODRET!=(ret=Netbios(&ncb)))
{
return -3;
}
memcpy(mac,adapter_status->adapter_address,6);
memcpy(machname,name_buffer[0].name,16);
return 1;
}//显示返回值
STATE showret(int ret)
{
switch(ret)
{
case NRC_GOODRET:
MessageBox(NULL,"NRC_GOODRET","",MB_OK);
break;
case NRC_BUFLEN:
MessageBox(NULL,"NRC_BUFLEN","",MB_OK);
break;
case NRC_ILLCMD:
MessageBox(NULL,"NRC_ILLCMD","",MB_OK);
break;
case NRC_CMDTMO:
MessageBox(NULL,"NRC_CMDTMO","",MB_OK);
break;
case NRC_INCOMP:
MessageBox(NULL,"NRC_INCOMP","",MB_OK);
break;
case NRC_BADDR:
MessageBox(NULL,"NRC_BADDR","",MB_OK);
break;
case NRC_SNUMOUT:
MessageBox(NULL,"NRC_SNUMOUT","",MB_OK);
break;
default :
MessageBox(NULL,"default","",MB_OK);
} return 1;
}//生成MAC地址字符串
STATE mactostr(UCHAR * mac,char * str,int len)
{
char str2[5];
int i; if(len<19)
{
return -1;
} str[0]='\0'; for(i=0;i<=5;i++)
{
itoa(mac[i],str2,16);
if(strlen(str2)<2)
{
strcat(str,"0");
}
strcat(str,str2);
strcat(str," ");
} return 1;
}//从字符串生成MAC地址
STATE strtomac(char * macstr,UCHAR * mac)
{
char str[32];
char c;
int i,j,k; j=strlen(macstr);
for(i=0,k=0;i<j;i++)
{
c=macstr[i];
if(c>='0' && c<='9')
{
str[k]=(char)(c-'0');
k++;
}
else if(c>='a' && c<='f')
{
str[k]=(char)(c-'a'+10);
k++;
}
else if(c>='A' && c<='F')
{
str[k]=(char)(c-'A'+10);
k++;
}
else if(' '==c || ','==c)
{
if(0!=k%2)
{
return -1;
}
}
else
{
return -1;
} if(12+1<k)
{
return -2;
}
}
if(12!=k)
{
return -2;
} for(i=0;i<6;i++)
{
mac[i]=(char)(str[2*i]*16+str[2*i+1]);
} return 1;
}
//getmac.cpp
//取得连接方MAC地址//需要链接netapi32.lib #include "stdafx.h"
#include "mystd.h"#include "nb30.h"//取得MAC地址
STATE getmac(char * ip,UCHAR * mac,int maclen,char * machname,int machnamelen)
{
char ncb_buffer[sizeof(ADAPTER_STATUS)+256*sizeof(NAME_BUFFER)];
UCHAR ret;
NCB ncb;
ADAPTER_STATUS * adapter_status;
NAME_BUFFER * name_buffer; if(maclen<6||machnamelen<16)
{
return -1;
} memset(&ncb,0,sizeof(NCB)); adapter_status=(ADAPTER_STATUS *)ncb_buffer;
name_buffer=(NAME_BUFFER *)(ncb_buffer+sizeof(ADAPTER_STATUS));
ncb.ncb_lana_num=0;
ncb.ncb_lsn=0;
ncb.ncb_num=0;
ncb.ncb_command=NCBRESET;
// if(NRC_GOODRET!=(ret=Netbios(&ncb)))
{
// return -2;
} memset((char *)ncb.ncb_callname,' ',15);
ncb.ncb_callname[15]='\0';
memcpy((char *)ncb.ncb_callname,ip,strlen(ip));
ncb.ncb_buffer=(unsigned char *)ncb_buffer;
ncb.ncb_length=sizeof(ADAPTER_STATUS)+256*sizeof(NAME_BUFFER);
ncb.ncb_lana_num=0; name_buffer->name[0]='\0'; ncb.ncb_command=NCBASTAT;
if(NRC_GOODRET!=(ret=Netbios(&ncb)))
{
return -3;
}
memcpy(mac,adapter_status->adapter_address,6);
memcpy(machname,name_buffer[0].name,16);
return 1;
}//显示返回值
STATE showret(int ret)
{
switch(ret)
{
case NRC_GOODRET:
MessageBox(NULL,"NRC_GOODRET","",MB_OK);
break;
case NRC_BUFLEN:
MessageBox(NULL,"NRC_BUFLEN","",MB_OK);
break;
case NRC_ILLCMD:
MessageBox(NULL,"NRC_ILLCMD","",MB_OK);
break;
case NRC_CMDTMO:
MessageBox(NULL,"NRC_CMDTMO","",MB_OK);
break;
case NRC_INCOMP:
MessageBox(NULL,"NRC_INCOMP","",MB_OK);
break;
case NRC_BADDR:
MessageBox(NULL,"NRC_BADDR","",MB_OK);
break;
case NRC_SNUMOUT:
MessageBox(NULL,"NRC_SNUMOUT","",MB_OK);
break;
default :
MessageBox(NULL,"default","",MB_OK);
} return 1;
}//生成MAC地址字符串
STATE mactostr(UCHAR * mac,char * str,int len)
{
char str2[5];
int i; if(len<19)
{
return -1;
} str[0]='\0'; for(i=0;i<=5;i++)
{
itoa(mac[i],str2,16);
if(strlen(str2)<2)
{
strcat(str,"0");
}
strcat(str,str2);
strcat(str," ");
} return 1;
}//从字符串生成MAC地址
STATE strtomac(char * macstr,UCHAR * mac)
{
char str[32];
char c;
int i,j,k; j=strlen(macstr);
for(i=0,k=0;i<j;i++)
{
c=macstr[i];
if(c>='0' && c<='9')
{
str[k]=(char)(c-'0');
k++;
}
else if(c>='a' && c<='f')
{
str[k]=(char)(c-'a'+10);
k++;
}
else if(c>='A' && c<='F')
{
str[k]=(char)(c-'A'+10);
k++;
}
else if(' '==c || ','==c)
{
if(0!=k%2)
{
return -1;
}
}
else
{
return -1;
} if(12+1<k)
{
return -2;
}
}
if(12!=k)
{
return -2;
} for(i=0;i<6;i++)
{
mac[i]=(char)(str[2*i]*16+str[2*i+1]);
} return 1;
}
解决方案 »
- 恭喜老刘和bdmh两位当上版主
- DBGrid直接修改的问题(送分了)
- 急,如何在程序中时时测试数据库的连接状态,在线等待!!!
- 求救:关于图表的问题。分不够再加!谢谢了!
- 初学者的问题
- 在我选种stringgrid的单元格时,总是显示一个选种的虚线框,如何一选种单元格,就变成竖线光标
- 三键鼠标中键的问题
- 查找IXMLNODE的父节点(在线等候)
- diamond ado v2的事务中循环进行insert的问题,解决的送diamond ado v2源码版!!!
- 请教一下在enterprise的DELPHI5.0如何使用三层结构编程
- }}==>>> 如何实现对“输入法”调用的功能??
- 用delphi5编程,使用TDBEdit控件,与他相连的字段是float类型,在输入完2.95后这个数自动变为2.94,为何?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,nb30;type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
Function NBGetAdapterAddress(a:integer):String;
procedure FormCreate(Sender: TObject);
private
{ Private declarations } public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.add('您的第'+edit1.text+'个适配器的MAC地址为'+NBGetAdapterAddress(StrtoInt(Edit1.Text)));
end;
function TForm1.NBGetAdapterAddress(a: integer): String;
//a指定多个网卡适配器中的哪一个0,1,2...
Var
NCB:TNCB; // Netbios control block file://NetBios控制块
ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; // Temporary work value//临时变量
cRC : Char; // Netbios return code//NetBios返回值
strTemp : String; // Temporary string//临时变量Begin
// Initialize
Result := ''; Try
// Zero control blocl
ZeroMemory(@NCB, SizeOf(NCB)); // Issue enum command
NCB.ncb_command:=Chr(NCBENUM);
cRC := NetBios(@NCB); // Reissue enum command
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit; // Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit; // Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
cRC := NetBios(@NCB); // Convert it to string
strTemp := '';
For intIdx := 0 To 5 Do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
Result := strTemp;
Finally
End;end;procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.lines.Clear;
end;end.
谢谢computerallen(),我测试成功后会再加分的。