//---------------------------------------------------------------------------
// Devuelve el numero de interfaces
// -1 en caso de error
//---------------------------------------------------------------------------
int __fastcall TForm1::GetInterfaceInfo(void)
{
typedef WINSOCK_API_LINKAGE int WSAAPI (*PFWSAIoctl)(SOCKET, DWORD,
LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED,
LPWSAOVERLAPPED_COMPLETION_ROUTINE);
WSADATA wsaData;
if (WSAStartup(0x0002, &wsaData))
return -1;
// Como no indicas que versión de C++Builder usas
// cargamos dinámicamente la siguiente librería,
// si estas usando BCB5/6 puedes enlazarla estáticamente
// tienes ws2_32.lib en el subdirectorio ...\lib\Psdk
HINSTANCE hLib = LoadLibrary("ws2_32.dll");
if (!hLib)
return -1;
// Obtenemos la direccion de "WSAIoctl" dinamicamente
PFWSAIoctl fWSAIoctl = (PFWSAIoctl)GetProcAddress(hLib, "WSAIoctl");
if (!fWSAIoctl)
{
FreeLibrary(hLib);
return -1;
}
int s = socket(AF_INET, SOCK_RAW, 0);
DWORD dwBytesReturned;
int n = fWSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0,
(LPVOID)&m_interfaceInfo, sizeof(m_interfaceInfo),
&dwBytesReturned, NULL, NULL);
n = (dwBytesReturned > 0) ? dwBytesReturned / sizeof(INTERFACE_INFO) : 0;
closesocket(s);
FreeLibrary(hLib);
WSACleanup();
return n;
}