2012-09-25 16 views
5

プログラムでIPアドレスを設定するにはどうすればよいですか?IPアドレスをプログラムによって設定するにはどうすればよいですか?

私のアプリケーションは、(私はAbout.comからコードが良くないかもしれないかどうかわからないのですが)私はテスト目的のために、プログラムのアドレスを設定できるようにしたい

DelphiTricksからのコードを使用して、それをチェックしています。そして(私はこれが重要かどうか分からない)、私はネットワーク上に(ラップトップ上、電車内に)接続されていなくても、そうすることができるようにしたい。

+1

短い答え:既知の環境でシステムレベルの作業を行っている場合を除き、通常は**できません。大多数のシステムは、[DHCP](http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol)サーバーを介してアドレスを受け取り、自分のIPアドレスをランダムに絡めてしまうと、接続が失われる可能性があります。あなたがいる環境を知っていて、安全にこれを行うことができれば、彼女と仕事をするための何かを与える必要があります。あなたはroot/admin権限を持っていますか?基本的なもの。 –

+1

あなたのアプリが見ているものを変更することを意味しますか?単純な条件付きコンパイルでそれを行うべきです。 ipを取得したコードを変更して設定します。 –

答えて

9

ネットワークアダプターのIPアドレスを変更するには、Win32_NetworkAdapterConfiguration WMIクラスのEnableStaticメソッドまたはAddIPAddress WinApiメソッドを使用できます。

WMIを使用するこのサンプルを試してください。

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, 
    ActiveX, 
    Variants, 
    ComObj; 

procedure SetStaticIpAddress(const NetworkCard, IPAddress, Mask :string); 
const 
    WbemUser =''; 
    WbemPassword=''; 
    WbemComputer='localhost'; 
    wbemFlagForwardOnly = $00000020; 
var 
    FSWbemLocator : OLEVariant; 
    FWMIService  : OLEVariant; 
    FWbemObjectSet : OLEVariant; 
    FWbemObject  : OLEVariant; 
    FOutParams  : OLEVariant; 
    vIpAddress  : OLEVariant; 
    vMask   : OLEVariant; 
    oEnum   : IEnumvariant; 
    iValue   : LongWord; 
begin 
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); 
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); 

    FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT * FROM Win32_NetworkAdapterConfiguration Where Description="%s"',[NetworkCard]),'WQL',wbemFlagForwardOnly); 
    oEnum   := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; 
    if oEnum.Next(1, FWbemObject, iValue) = 0 then 
    begin 
    vIpAddress := VarArrayCreate([0, 0], varVariant); 
    vIpAddress[0]:= IPAddress; 
    vMask := VarArrayCreate([0, 0], varVariant); 
    vMask[0]:= Mask; 
    FOutParams:=FWbemObject.EnableStatic(vIpAddress, vMask); 
    // 0 - Successful completion, no reboot required 
    // 1 - Successful completion, reboot required 
    Writeln(Format('ReturnValue %s',[FOutParams])); 
    end 
    else 
    Writeln('Network card not found'); 
end; 


begin 
try 
    CoInitialize(nil); 
    try 
     SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0'); 
    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. 
+3

+1、['ShellExecute'](http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v = vs.85).aspx)のようなものは[' this' ](http://serverfault.com/a/39670/98231)? – TLama

+1

はい、それは有効な3番目のオプションです:) – RRUZ

+0

+1に両方。 @ Rudy、私は今コードを試しています。しかし、愚かな質問 - どのようにネットワークカードに与えるべき価値を知っていますか? – Mawg

関連する問題