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 :)
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...
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 :)
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"
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...