Win2000でMACアドレスを取得するには?

解決


kazumarin  2001-11-14 10:16:33  No: 292  IP: [192.*.*.*]

GUIDを生成して、下12桁からMACアドレスを取得する方法を
用いて開発していたのですが、Win2000だとうまくいきません。
Windows APIのNetBiosを使って取得する方法もあると
聞いたのですが・・・。
方法は問いませんのでどなたか教えていただけませんか?

編集 削除
にしの  2001-11-14 11:52:53  No: 293  IP: [192.*.*.*]

C言語はわかりますか?
もしわかるなら、
http://www.microsoft.com/japan/support/kb/articles/J024/1/98.htm
で解決するかと思います。

編集 削除
にしの  2001-11-14 11:54:11  No: 294  IP: [192.*.*.*]

忘れてました。

nb30ユニットで、NetBios、TNCBなどの定義があります。

編集 削除
にしの  2001-11-14 12:19:46  No: 295  IP: [192.*.*.*]

上の例のDELPHI版です。
implementation以下に貼り付けてください。フォームの名前はForm1、貼り付けてあるのはMemo1です。
Form1のOnCreate(FormCreate)が、下のFormCreateです。
//--ここから
uses nb30;

type
  PAstat = ^TAstat;
  TAstat = packed record
  adapt: TAdapterStatus;
  NameBuff: array [0 .. 29] of TNameBuffer;
  end;

var
  Adapter: TAstat;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  Ncb: TNCB;
  RetCode: Integer;
  lenum: TLanaEnum;
  i: integer;
begin
  Memo1.Lines.Clear;
//
  FillChar(Ncb, SizeOf(NCB), 0);
  Ncb.ncb_command := Char(NCBENUM);
  Ncb.ncb_buffer := @lenum;
  Ncb.ncb_length := SizeOf(lenum);
  RetCode := Integer(Netbios( @Ncb ));
  Memo1.Lines.Add( 'The NCBENUM return code is: $' + IntToHex(RetCode, 2) );

  for i := 0 to integer(lenum.length) - 1 do
  begin
    FillChar(Ncb, SizeOf(NCB), 0);
    Ncb.ncb_command := Char(NCBRESET);
    Ncb.ncb_lana_num := lenum.lana[i];

    RetCode := Integer(Netbios( @Ncb ));
    Memo1.Lines.Add( 'The NCBRESET on LANA ' + IntToStr(Integer(lenum.lana[i]))
                    +' return code is: $' + IntToHex(RetCode, 2) );

    FillChar(Ncb, SizeOf(NCB), 0);
    Ncb.ncb_command := Char(NCBASTAT);
    Ncb.ncb_lana_num := lenum.lana[i];

    Ncb.ncb_callname := '*               ';
    Ncb.ncb_buffer := @Adapter;
    Ncb.ncb_length := SizeOf(Adapter);

    RetCode := Integer(Netbios( @Ncb ));
    Memo1.Lines.Add( 'The NCBASTAT on LANA ' + IntToStr(Integer(lenum.lana[i]))
                    +' return code is: $' + IntToHex(RetCode, 2) );

    if RetCode = 0 then
    begin
      Memo1.Lines.Add('The Ethernet Number on LANA ' + IntToStr(Integer(lenum.lana[i]))
        + ' is:' + IntToHex(integer(Adapter.adapt.adapter_address[0]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[1]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[2]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[3]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[4]), 2)
           + '-' + IntToHex(integer(Adapter.adapt.adapter_address[5]), 2));
    end;
  end;
end;
//--ここまで

編集 削除
kazumarin  2001-11-14 15:47:51  No: 296  IP: [192.*.*.*]

にしのさんはじめまして。
Win2000でのMACアドレスの取得に成功いたしました。
ありがとうございます。もう1件なのですが
上記の例で、MACアドレスの数値12桁のみを
var文で宣言した変数に代入したいのですが
どこをどうすればよいのでしょうか?
Delphi初心者なものでよくわかりません。
どうかよろしくお願いします。

編集 削除
にしの  2001-11-14 15:58:11  No: 297  IP: [192.*.*.*]

成功しているのなら、Adapter.adapt.adapter_address配列に数値が入っています。上では、ハイフン区切りにしていますが、そのハイフンを取ってしまえばできますよ。

編集 削除
kazumarin  2001-11-14 16:47:02  No: 298  IP: [192.*.*.*]

何度も申し訳ありません。
MACアドレスを12桁のみMemo1に表示することは出来たのですが
数値を開発中のシステム起動に使用するため、
Memoオブジェクトを使わずに何か変数に代入して
使いたいのです。いろいろ試してみたのですが
変数の型が合わなかったりとうまく変数にセットできません。
もう一度助言をお願い致します。

編集 削除
kazumarin  2001-11-14 18:37:04  No: 299  IP: [192.*.*.*]

なんとか自分でできました。
初歩的なことから丁寧に教えていただき
本当に助かりました、ありがとうございます。
また宜しくお願い致します。

編集 削除