回答
您可以使用Win32_NetworkAdapterConfiguration WMI類和IPSubnet
屬性。
試試這個示例代碼
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants;
function VarArrayToStr(const vArray: variant): string;
function _VarToStr(const V: variant): string;
var
Vt: integer;
begin
Vt := VarType(V);
case Vt of
varSmallint,
varInteger : Result := IntToStr(integer(V));
varSingle,
varDouble,
varCurrency : Result := FloatToStr(Double(V));
varDate : Result := VarToStr(V);
varOleStr : Result := WideString(V);
varBoolean : Result := VarToStr(V);
varVariant : Result := VarToStr(Variant(V));
varByte : Result := char(byte(V));
varString : Result := String(V);
varArray : Result := VarArrayToStr(Variant(V));
end;
end;
var
i : integer;
begin
Result := '[';
if (VarType(vArray) and VarArray)=0 then
Result := _VarToStr(vArray)
else
for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do
if i=VarArrayLowBound(vArray, 1) then
Result := Result+_VarToStr(vArray[i])
else
Result := Result+'|'+_VarToStr(vArray[i]);
Result:=Result+']';
end;
procedure GetWin32_NetworkAdapterConfigurationInfo;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IpEnabled=True','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Writeln(Format('Caption %s',[String(FWbemObject.Caption)]));// String
if not VarIsNull(FWbemObject.DHCPServer) then
Writeln(Format('DHCPServer %s',[String(FWbemObject.DHCPServer)]));// String
if not VarIsNull(FWbemObject.IPAddress) then
Writeln(Format('IPAddress %s',[VarArrayToStr(FWbemObject.IPAddress)]));// array String
if not VarIsNull(FWbemObject.IPSubnet) then
Writeln(Format('IPSubnet %s',[VarArrayToStr(FWbemObject.IPSubnet)]));// array String
if not VarIsNull(FWbemObject.MACAddress) then
Writeln(Format('MACAddress %s',[VarArrayToStr(FWbemObject.MACAddress)]));// array String
Writeln;
FWbemObject:=Unassigned;
end;
end;
begin
try
CoInitialize(nil);
try
GetWin32_NetworkAdapterConfigurationInfo;
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
+1,這肯定比我一直試圖使用的兩種方法更容易。具有所有結構和枚舉的GetAdaptersAddresses約需要190行代碼。對於深度紮根的WMI對手來說,這是一個很好的例子。 – TLama
感謝,看起來不錯 –
編碼器更容易確定,肯定會在運行時更重。 –
1)計算機可能opart不同的網/子網。每個網絡適配器通常都有一些。或者甚至有時甚至超過一個。
2)即使物理上你只有一個網卡,ypou也有環回網絡 - 127.x.x.x子網。如果你有一些像Hamachi或Comodo一樣安裝的VPN - 那將會增加一個網絡適配器。連接電話調制解調器時也一樣。與XP兼容模式等虛擬機相同。所以你無論如何將不得不過濾一些標準。
3)您可以使用WMI的FindAdaptor功能登記網卡:http://www.magsys.co.uk/delphi/magwmi.asp 然後您可以閱讀這些適配器的屬性。 還提到了設置IP的函數,可能還有讀取它們的函數。
即使不是,如何讀取屬性顯示在演示中的URL。 要讀取哪些屬性,您可以確定使用任何WMI瀏覽器。 個人而言,我以ks-soft.net的WMI Explorer加上微軟的WMI工具而告終。 您可以像調整SQLite那樣調試WMI請求,然後將它傳遞給WMI包裝並讀取結果。 但是,返回上述設置IP地址功能,其源可能已經包含屬性名稱,只是爲了節省探索。
- 1. 德爾福掩碼的二進制數
- 2. 計算子網掩碼?
- 3. 德爾福2010年計算列在DBGrid
- 4. 德爾福中的掩蔽例外
- 5. 德爾福,需要幫助「使計算機計數」
- 6. 德爾福時間數學計算器
- 7. 德爾福:德爾福和Microsoft SQL Server 2005從功能不好的計算值
- 8. 密碼Rijndael算法德爾福2010 DCP
- 9. 德爾福QR碼組件/發電機?
- 10. 問題計算子網掩碼
- 11. 計算子網掩碼手動
- 12. 從IP範圍計算子網掩碼
- 13. 德爾福多打印機
- 14. 德爾福v.Word - 如何從德爾福
- 15. 德爾福HID Delphi7和德爾福XE2
- 16. 德爾福互聯網鉤
- 17. 德爾福 - SQL廣域網
- 18. 德爾福 - ADODataSet子集
- 19. 轉換德爾福7代碼與德爾福2009年工作
- 20. 翻譯代碼DLL注入德爾福7德爾福XE2
- 21. 德爾福2010密碼庫
- 22. 轉換代碼德爾福
- 23. 德爾福HTML解碼
- 24. QR碼組件德爾福
- 25. ListViewButtonClick在德爾福
- 26. 在德爾福7
- 27. 德爾福在Vista
- 28. 德爾福不認識到多臺打印機存在
- 29. 德爾福XE7 crashses在關機
- 30. 德爾福
請問您的應用程序的目標也與機器Windows 2K的?如果沒有,那麼我可以嘗試使用['GetAdaptersAddresses'](http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa365915(v = vs.85).aspx)函數相反(在RRUZ喚醒WMI解決方案之前:-) – TLama
是的,請使用GetAdaptersAddresses示例。我們使用XP及以上版本。 –
當我通過全新的標題翻譯讓Delphi的GetAdaptersAddresses工作時,我發現了一個MS驚喜 - 如何從這個大結構中獲得IP掩碼。看看['這個線程'](http://comp.newsgroups.archived.at/os.ms-windows.programmer.win32/200908/09081149950.html)部分感受到我目前的脾氣。我可以在這裏發佈它,但我真的不知道是否有一種方法可以獲得與上面的系統支持的'ConvertLengthToIpv4Mask'不同的方法。在所有情況下,我會回顧我已經發布的內容。我越來越覺得,WMI將是最簡單的方法。 – TLama