0

GetAdaptersAddressesの MSDN の例から多かれ少なかれコピーして貼り付けた次のコードを使用すると、戻り値 122 が返されます。これは、ERROR_INSUFFICIENT_BUFFER を意味します (このシステム エラー コード リストによると)。

ULONG outBufLen = 150000;   // Tried for different (large) values here...
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);
DWORD dwRetVal = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen);
// ....
free(pAddresses);

GetAdaptersAddresses のドキュメントには、予期される戻り値の 1 つとして ERROR_INSUFFICIENT_BUFFER が記載されていません。(これには、outBufLen を必要な値に調整する必要がある ERROR_BUFFER_OVERFLOW がリストされていますが、変更されていません)。

代わりに GetAdaptersInfo を使用すると、同じ症状が発生します。

このエラーは私の開発マシンでは発生しませんが、1 つの仮想および 1 つの実際のクリーンな Windows 7 x86 SP1 インストール (VC++ 再配布可能ファイルを追加) では発生しません。

C++ の初心者として、私は何か間違ったことをしていますか? このエラーの原因と修正方法を教えてください。=)

4

4 に答える 4

4

まず、他の人が提案しているように、2回の呼び出しを実行して、必要なバッファーサイズを見つけてから、クエリ自体を実行できます。特にエラーが発生した場合、最初の試みはAPIに予想されるサイズを尋ねることです。

次に、このAPIは、大量のメモリを消費する32ビットプロセスでは安全ではないため、バッファがより高い2GBのアドレス空間にまたがることを知っておく必要があります。APIは、それ自体のバグまたは基盤となるレイヤーのバグが原因で、奇妙な方法で動作し始める可能性があります。MS Connectの詳細については、こちらをご覧くださいGetAdaptersAddresses。APIは、メモリ消費量の多いプロセスに対して誤ってアダプタを返しません

エラーコードが「期待される戻り値の1つ」ではないという事実は、エラーが基盤となるレイヤーから発生し、このAPIが内部障害でエラーを渡すだけであることをバージョンに示しています。手がかりとして、システムの一部のネットワークアダプターを無効にすると、エラーが解消される場合があります。

于 2012-09-05T10:59:46.363 に答える
1

Visual Studio が "IPHLPAPI.dll" という名前のライブラリをプロジェクトと共に展開し、それが問題の原因でした。このファイルを削除すると解決しました。

なぜこれが事実だったのかは、さらなる研究の対象です=)

于 2012-09-05T10:51:38.160 に答える
0

必要な正確なバッファ サイズを知るには、pAddresses に NULL を渡すだけで、size が必要なサイズに設定されます。それが機能するように、コードを少し書き直す必要があるかもしれません。

DWORD rv, size = 0;
PIP_ADAPTER_ADDRESSES adapter_addresses;

rv = GetAdaptersAddresses(AF_INET, 0, NULL, NULL, &size);
if (rv != ERROR_BUFFER_OVERFLOW)
    return false; // ERROR

adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size);

rv = GetAdaptersAddresses(AF_INET, 0, NULL, adapter_addresses, &size);
if (rv != ERROR_SUCCESS) {
    free(adapter_addresses);
    return false; // ERROR
}
于 2012-09-05T10:31:32.503 に答える
0

まず、バッファはメモリのブロックです。

不十分ということは、どういうわけか十分なメモリを与えていないことを意味する可能性があります。アクセスできないメモリのブロックである可能性があります。住所すら存在しないのかもしれません。

これを見てください:

ERROR_INSUFFICIENT_BUFFER
    122 (0x7A)

    The data area passed to a system call is too small.

これは、バッファに十分なメモリが割り当てられていないように思えます。または類似。

たぶん

outBufLen 

特定の長さ、おそらくメモリブロックのサイズである必要があります。「名前」をチェックせずに、各変数のサイズを比較しようとする場合があるためです。このアイデアは、High Level Shader Language から生まれました。

だから私はもう少し見てみようと思います:

ULONG outBufLen = 150000;   // Tried for different (large) values here...
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);

幸運を!

于 2012-09-05T10:23:21.303 に答える