[C++/Qt] Nazwa interfejsu sieciowego na Windowsie

0

Witam,
napisałem sobie program będący czymś w rodzaju małego informatora o interfejsach sieciowych. Jest sobie QComboBox wypełniony znalezionymi interfejsami i przy naciśnięciu przycisku Refresh etc pokazują mi się dane jak MAC, IP, adres rozgłoszeniowy i maska podsieci. Na Linuksie sprawa wygląda tak, że bo przeszukaniu połączeń mam QComboBox wypełniony takimi nazwami jak "lo", "eth1", "ppp0" i jest ok. Sprawa ma się gorzej na Windowsie (wiem w Qt Assistant pisali o tym i ostrzegali) mam ciągi liczb będących bodajże jakmiś numerami indentyfikacyjnymi danych połączeń. Niestety nie znam się za bardzo na WinAPI i dlatego pytam Was, czy ktoś może zna jakiś sposób na przekonwertowanie tych numerów ID (czy tak ? To są numery ID interfejsów ?) na jakieś sensowne nazwy jak Hamachi Interface albo Połączenie Lokalne. Czy to trzeba grzebać w rejestrze czy są jakieś specjalne funkcje & struktury ? Będe wdzięczy za pomoc.
Jeszcze tylko dodam jak wyglądają te indentyfikatory:
{9B01855D-A4A7-42A6-812B-6EC0EE897C2F} - wg wyników i po sprawdzeniu w Panelu Sterowania jest to "Połączenie lokalne"
{9794FD04-7953-46F1-A284-82F72E580E40} - wg wydruków i po sprawdzeniu w Panelu Sterowania jest to "Hamachi"
I jeszcze niejaki MS TCP Loopback interface (już chociaż z nazwą) co jest - wiadomo - interfejsem zwrotnym.
PS: Kodu źródłowego nie dołączam, bo chyba nie jest potrzebny. Jeśli będzie to napiszcie wrzuce wszytko co trzeba :)

0

To są numery ID interfejsów ?
Prawdopodobnie są to identyfikatory GUID interfejsów.

Przyjrzyj się kluczowi rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network, a dokładnie jego podkluczowi, zawierającemu wartość o nazwie Class zawierającą łańcuch Net.

Nie wiem czy jest to jedyny sposób na wyciągnięcie tych danych, być może istnieje prostsze rozwiązanie...

0

Miałeś rację to są numery GUID interfejsów. Co więcej faktycznie przeglądając rejestr wg ścieżki którą podałeś mam pewne pola gdzie jest string z nazwą interfejsu. Jednak przeglądam MSDN wpisuje różne, różniste kombinacje słów kluczowych z "GUID" i nic nie mogę znaleŹć co miałoby dla mnie jakiś sens. Może jakaś mała wskazówka ? Jakaś nazwa funkcji lub klasy ? Ja osobiście jako Linuksiarz gubię się na tej stronie a chcę to jakoś załatwić w imię przenośności mojego kodu :)

0

przykladzik zamieszczony w http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx dziala slicznie. moze uzywasz czegos innego, albo pomyliles guid z opisem?

printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName); //GUID
printf("\tAdapter Desc: \t%s\n", pAdapter->Description); //"NAZWA"

0

Wielkie dzięki quetzalcoatl. Zmyliła mnie terminologia. W środowisku uniksowym funkcjonuje pojęcie "interfejs sieciowy" a w świecie WinAPI "adapter " dlatego nie udało mi się nic znaleŹć. Podane linki i przykładowe kody źródłowe z pewnością pomogą. Co prawda nie do końca mi o to chodziło, bowiem tamte funkcje "odpytują" system w poszukiwaniu listy interfejsów, a mój program już to robi dzięki bibliotece Qt. No nic dodam parę makr aby tylko na Windowsie były drugie pobieranie adapterów sieciowych tylko po to aby uzyskać ich nazwy i dodać do ComboBox`a. Ponownie dzięki za pomoc :-)

EDIT: No chyba nieco za szybko przesłodziłem. Mam teraz parę problemów z kompilacją kodu. Porobiłem odpowiednie warunki kompilacji aby używać tych funkcji z WinAPI tylko na Windowsie i mam taki komunikat:

qip.cpp:53: error: expected `;' before "pAddresses"
qip.cpp:54: error: `ULONG' undeclared (first use this function)
qip.cpp:54: error: expected `;' before "outBufLen"
qip.cpp:56: error: `AF_UNSPEC' undeclared (first use this function)
qip.cpp:56: error: `GAA_FLAG_INCLUDE_PREFIX' undeclared (first use this function
)
qip.cpp:56: error: `pAddresses' undeclared (first use this function)
qip.cpp:56: error: `outBufLen' undeclared (first use this function)
qip.cpp:56: error: `GetAdaptersAddresses' undeclared (first use this function)
qip.cpp:56: error: `ERROR_BUFFER_OVERFLOW' undeclared (first use this function)
qip.cpp:58: error: `GetProcessHeap' undeclared (first use this function)
qip.cpp:58: error: `HeapFree' undeclared (first use this function)
qip.cpp:59: error: `IP_ADAPTER_ADDRESSES' undeclared (first use this function)
qip.cpp:59: error: expected primary-expression before ')' token
qip.cpp:59: error: expected `;' before "HeapAlloc"
qip.cpp:61: error: `NO_ERROR' undeclared (first use this function)
qip.cpp:64: error: `pCurrAddresses' undeclared (first use this function)
mingw32-make[1]: *** [release/qip.o] Error 1
mingw32-make[1]: Leaving directory `C:/Documents and Settings/Bartek/Moje dokume
nty/0.2'
mingw32-make: *** [release] Error 2

Czyli kompilator zgłasza błędy jakbym zupełnie nie dodał plików nagłówkowych. Kompiluje to z wersją biblioteki Qt 4.3.3 przy użyciu naturalnie MinGW a tam w katalogu "include" są odpowiednie pliki *.h, więc nie mam pojęcia gdzie leży problem. Kod źródłowy tego programu jest nieco długi aby go tak wrzucić na forum zatem podam linki do paste.org
Plik qip.h : http://paste.org/index.php?id=3088
Plik qip.cpp : http://paste.org/index.php?id=3089 (właściwie interesująca jest tylko funkcja createNetworkList() )

EDIT2: Dobra po części sobie poradziłem. Plik *.pro wygląda tak:

######################################################################
# Automatically generated by qmake (2.01a) Cz 19. cze 15:49:43 2008
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += . release
INCLUDEPATH += .

# Input
HEADERS += qip.h \
		   c:\mingw\include\iphlpapi.h \
		   c:\mingw\include\winsock2.h
FORMS += qip.ui
SOURCES += main.cpp qip.cpp
RESOURCES += qipresources.qrc
TRANSLATIONS += trans_pl.ts
QT += network
RC_FILE = qip_resource.rc

I przeniosłem wszystkie zmienne tymczasowe używane w createNetworkList() i będące w makrach Q_WS_WIN do pliku *.h (to znaczy ich deklaracje). Teraz mam tylko komunikat:
qip.h:77error:PIP_ADAPTER_ADDRESSES does not name a typ
I oczywiście error. Może sam dojdę do błędu...

1 użytkowników online, w tym zalogowanych: 0, gości: 1