dポイントプレゼントキャンペーン実施中!

getiftable関数を使用してMACアドレスを取得しようと思っているのですが、ipconfigで確認したMACアドレスとは違う値が返ってきて困っています。
ちなみにXPで作成したプログラムを動かすと正しいアドレスが返ってくるのですが、7で動かした場合に違う値が返ってきます。
ネットで同様の事例が無いか探しているのですが中々発見できず、質問に至った次第です。
OSの違いで何か不具合が起こったりしているのでしょうか、分かる方至急回答の方を宜しくお願いします。

A 回答 (4件)

>試験を行っているPCで確認したところ18個取りにいっていました。


>・・・18ってどっから取ってるんだろう?w

いまいち謎…ですね。

>ipconfigで確認できるのは確か5つぐらいだったので、ここで確認したもの以外にも取得しているテーブルが存在するということになりますが、確認方法ってあるのでしょうか?

ネットで検索すると…
MIB_IFTABLE構造体ののtable[].dwTypeとMIB_IFTABLE構造体ののtable[].dwOperStatusで判定している例がありますね。
http://drumken.blog8.fc2.com/blog-entry-185.html

dwTypeがMIB_IF_TYPE_ETHERNETのもの…でしょうかね?
# 無線LANだと別の値…なのかな?
# http://social.msdn.microsoft.com/Forums/ja-JP/vs …

派遣先のノートPC(XP Sp3)で下記のコード(VC++2010のWin32コンソールに必要なヘッダとライブラリを指定)を実行するとLoopbackとか出てきますね。
# MS TCP Loopback interface。
# 自宅のWindows7だとTunnel adapter isatap.{*****}がいくつも出てくるんでしょうなぁ。

 PMIB_IFTABLE pMibIfTable;
 ULONG ulSize = 0;

 if (ERROR_INSUFFICIENT_BUFFER == GetIfTable(NULL, &ulSize, FALSE)) {
  pMibIfTable = (PMIB_IFTABLE)new char[ulSize];
  if (NO_ERROR == GetIfTable(pMibIfTable, &ulSize, FALSE)) {
   PMIB_IFROW pMibIfRow = &pMibIfTable->table[0];
   DWORD dwCnt;

   for(dwCnt = 0;dwCnt < pMibIfTable->dwNumEntries;dwCnt++, pMibIfRow++) {
    printf("%s:", pMibIfRow->bDescr);
    if(pMibIfRow->dwPhysAddrLen != 0) {
     DWORD dwPhysAddrCnt;
     for(dwPhysAddrCnt = 0;dwPhysAddrCnt < pMibIfRow->dwPhysAddrLen;dwPhysAddrCnt++) {
      _tprintf(_T("%02X"), pMibIfRow->bPhysAddr[dwPhysAddrCnt]);
      if(dwPhysAddrCnt != (pMibIfRow->dwPhysAddrLen - 1))
       _tprintf(_T("-"));
      else
       _tprintf(_T("\n"));
     }
    } else {
     _tprintf(_T("none\n"));
    }
   }
  }
  delete[] pMibIfTable;
 }
    • good
    • 0

>ログ出せばいいじゃないかという結論に



ファイルに落とすとか、OutputDebugString()で出力してデバッグモニタ系のソフトを使うとか……
まあ、いろいろありますね。

しかし…36個はちょっとびっくりでした。
内容、細かく確認はしていませんでしたが。
# というかGetIfTable()した後、ブレークしてウォッチで眺めただけなので。
    • good
    • 0
この回答へのお礼

先日はありがとうございました。
試験を行っているPCで確認したところ18個取りにいっていました。
・・・18ってどっから取ってるんだろう?w
特に何も入れていないですし、ほぼ新品の状態なのですが・・・。
ipconfigで確認できるのは確か5つぐらいだったので、ここで確認したもの以外にも取得しているテーブルが存在するということになりますが、確認方法ってあるのでしょうか?

お礼日時:2013/02/21 08:56

MIB_IFTABLE構造体のdwNumEntriesはいくつになってます?



ちなみに、ウチの環境(Windows7 Professional 64bit)では36に。
VMWarePlayerとVirtualBoxがインストールされてて、Bluetoothアダプタも付けてて……。
Tunnel adapter isatap.{}がいくつもあります。

この回答への補足

ログ出せばいいじゃないかという結論に、お礼してから気づきましたw
やってみます。

補足日時:2013/02/20 14:18
    • good
    • 0
この回答へのお礼

返事が遅れました、ご回答ありがとうございます。
XPでデバッグをかけて確認したところテーブル数に問題はなかったです。
7の方ではデバッグをかけれる環境は構築していない(というより現状できない)ため、確認が出来ないのですが、なんとか確認してみようとは思います。
多分変なところに値取にいってそうなので、テーブル数が合わない可能性があるかもですよね。
自分のPCではないので迂闊に環境構築できないのがネック、なんとかしたいなぁ・・・。

お礼日時:2013/02/20 14:17

NICの情報はちゃんと確認してますか?



Win7で仮想NICがインストールされている可能性があるので、MACアドレスを得る場合にNICの詳細情報を見ないで決め打ちで取得すると、仮想NICの情報を取得しちゃう可能性があります。

ちゃんと「NICが仮想か実体か」を確認する必要があります。

この回答への補足

すいません、調べましたがIPv6は問題では無さそうですね(汗
変な質問してすいません。

補足日時:2013/02/19 18:37
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
現在試験を行っているPCですが、仮想NICはインストールされていません。
なので原因は別にあるかなとは思うのですが、中々見つけれずにいます。
一応可能性として、IPv6が設定されていたのでその辺りが悪さしているというか、関数の構造体自体が対応していないために変な値を取りにいってるのでは、と考えているのですがどう思われますか?

お礼日時:2013/02/19 18:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!