This code change IP address with no problems
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
var
i : integer;
begin
Result :=VarArrayCreate([0, High(Arr)], varVariant);
for i:=Low(Arr) to High(Arr) do
Result[i]:=Arr[i];
end;
procedure SetStaticIP();
Const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
vIPAddress : OleVariant;
vSubnetMask : OleVariant;
vDefaultIPGateway : OleVariant;
vGatewayCostMetric : OleVariant;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
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
vIPAddress := ArrayToVarArray(['192.168.2.22']);
vSubnetMask := ArrayToVarArray(['255.255.255.0']);
if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
begin
vDefaultIPGateway := ArrayToVarArray(['192.168.2.2']);
vGatewayCostMetric := ArrayToVarArray(['1']);
FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
end;
VarClear(vIPAddress);
VarClear(vSubnetMask);
VarClear(vDefaultIPGateway);
VarClear(vGatewayCostMetric);
FWbemObject:=Unassigned;
end;
end;
But i want to let user input the (IP, Subnet, Gateway) So I changed the code like this
function ArrayToVarArray(Arr : Array Of string):OleVariant; overload;
var
i : integer;
begin
Result :=VarArrayCreate([0, High(Arr)], varVariant);
for i:=Low(Arr) to High(Arr) do
Result[i]:=Arr[i];
end;
procedure SetStaticIP(IP, Subnet, Gateway: array of string);
Const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
vIPAddress : OleVariant;
vSubnetMask : OleVariant;
vDefaultIPGateway : OleVariant;
vGatewayCostMetric : OleVariant;
begin
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
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
vIPAddress := ArrayToVarArray(IP);
vSubnetMask := ArrayToVarArray(Subnet);
if FWbemObject.EnableStatic(vIPAddress, vSubnetMask) = 0 then
begin
vDefaultIPGateway := ArrayToVarArray(Gateway);
vGatewayCostMetric := ArrayToVarArray(['1']);
FWbemObject.SetGateways(vDefaultIPGateway,vGatewayCostMetric);
end;
VarClear(vIPAddress);
VarClear(vSubnetMask);
VarClear(vDefaultIPGateway);
VarClear(vGatewayCostMetric);
FWbemObject:=Unassigned;
end;
end;
But it doesn't work anymore
I found that I have to convert the input text to array of string
,
so i did it like this
procedure TForm1.BtnApplyClick(Sender: TObject);
var
IP, Subnet, Gateway: array of string;
I: Integer;
begin
SetLength(IP, EdtIP.GetTextLen);
for I := 0 to EdtIP.GetTextLen do IP[I] := Copy(EdtIP.Text, I, 1);
SetLength(Subnet, EdtSubnet.GetTextLen);
for I := 0 to EdtSubnet.GetTextLen do Subnet[I] := Copy(EdtIP.Text, I, 1);
SetLength(Gateway, EdtGateway.GetTextLen);
for I := 0 to EdtGateway.GetTextLen do Gateway[I] := Copy(EdtIP.Text, I, 1);
SetStaticIP(IP, Subnet, Gateway);
end;
But it still didn't work, I can't find where I did mistake! Any idea to get this code work?