需要先引用 Microsoft Shell Controls And Automation(Shell32.dll)对应delphi声明 Shell32_TLB.pas 请问shell32.dll如何引用呢?无法编译,我已经uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,Shell32_TLB, StdCtrls, Menus; 里面已加入了Shell32_TLB,
2ccc.COM上有这个源码 100% OK的
部分代码: unit DeviceForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CheckLst, Common, RegStr;const DEV_CLASS_NAME = 'Net'; UNKNOWN_DEVICE = '<未知设备>';type TDevForm = class(TForm) lbDev: TLabel; btApply: TButton; btExit: TButton; clbDevList: TCheckListBox; btRefresh: TButton; procedure FormCreate(Sender: TObject); procedure btExitClick(Sender: TObject); procedure btApplyClick(Sender: TObject); procedure btRefreshClick(Sender: TObject); private { Private declarations } DevState: Array of Boolean; procedure RefreshDevState; procedure EnumNetDevice; function IsClassHidden(const ClassGUID: PGUID): Boolean; function ConstructDeviceName(DeviceInfoSet: HDEVINFO; DeviceInfoData: PSP_DEVINFO_DATA; Buffer: PAnsiChar; Length: ULONG): Boolean; function GetRegistryProperty(DeviceInfoSet: HDEVINFO; DeviceInfoData: PSP_DEVINFO_DATA; AProperty: ULONG; Buffer: PAnsiChar; Length: ULONG): Boolean; function IsDevDisable(DevIndex: DWORD; hDevInfo: HDEVINFO): Boolean; function ChangeDevState(DevIndex, NewState: DWORD): BOOL; public { Public declarations } end;var DevForm: TDevForm;implementation{$R *.dfm}procedure TDevForm.EnumNetDevice; var DeviceInfoSet: HDEVINFO; DeviceInfoData: SP_DEVINFO_DATA; i: Integer; Status, Problem: DWORD; ClassName: PChar; ClassSize, ReqClassSize: DWORD; DeviceName: PChar; begin clbDevList.Clear; DeviceInfoSet:=SetupDiGetClassDevs(Nil,Nil,0,DIGCF_ALLCLASSES or DIGCF_PRESENT); if DeviceInfoSet = Pointer(INVALID_HANDLE_VALUE) then Exit; ClassSize:=255; GetMem(ClassName,256); try DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA); i:=0; while SetupDiEnumDeviceInfo(DeviceInfoSet,i,@DeviceInfoData) do begin Inc(i); if not SetupDiClassNameFromGuid(@DeviceInfoData.ClassGuid,ClassName,ClassSize, @ReqClassSize) then begin if ReqClassSize>ClassSize then begin FreeMem(ClassName); ClassSize:=ReqClassSize; GetMem(ClassName,ClassSize+1); if not SetupDiClassNameFromGuid(@DeviceInfoData.ClassGuid,ClassName,ClassSize, @ReqClassSize) then Exit; end else Exit; end; if not SameText(ClassName,DEV_CLASS_NAME) then Continue; if CM_Get_DevNode_Status(@Status, @Problem, DeviceInfoData.DevInst,0) <> CR_SUCCESS then Exit; if ((Status and DN_NO_SHOW_IN_DM)<>0) or IsClassHidden(@DeviceInfoData.ClassGuid) then Continue; GetMem(DeviceName,256); ZeroMemory(DeviceName,256); ConstructDeviceName(DeviceInfoSet,@DeviceInfoData,DeviceName,255); clbDevList.Items.AddObject(StrPas(DeviceName),TObject(i-1)); clbDevList.Checked[clbDevList.Count-1]:=IsDevDisable(i-1,DeviceInfoSet); FreeMem(DeviceName); end; finally FreeMem(ClassName); SetupDiDestroyDeviceInfoList(DeviceInfoSet); end; end;function TDevForm.ConstructDeviceName(DeviceInfoSet: HDEVINFO; DeviceInfoData: PSP_DEVINFO_DATA; Buffer: PAnsiChar; Length: ULONG): Boolean; begin Result:=True; if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_FRIENDLYNAME, Buffer,Length) then begin if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_DEVICEDESC, Buffer,Length) then begin if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_CLASS, Buffer,Length) then begin if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_CLASSGUID, Buffer,Length) then begin StrCopy(Buffer,UNKNOWN_DEVICE); end else Result:=False; end end end; end;function TDevForm.GetRegistryProperty(DeviceInfoSet: HDEVINFO; DeviceInfoData: PSP_DEVINFO_DATA; AProperty: ULONG; Buffer: PAnsiChar; Length: ULONG): Boolean; var ReqLen: DWORD; begin Result:=False; while not SetupDiGetDeviceRegistryProperty(DeviceInfoSet,DeviceInfoData, AProperty,Nil,Buffer,Length,@ReqLen) do begin if GetLastError() = ERROR_INVALID_DATA then break else if GetLastError() = ERROR_INSUFFICIENT_BUFFER then begin if Assigned(Buffer) then FreeMem(Buffer); Length:=ReqLen; GetMem(Buffer,Length+1); end else Exit; end; Result:=Buffer^<>#0; end;function TDevForm.IsClassHidden(const ClassGUID: PGUID): Boolean; var hKeyClass: HKEY; begin Result:=False; hKeyClass := SetupDiOpenClassRegKey(ClassGuid,KEY_READ); if hKeyClass<>0 then begin Result:= RegQueryValueEx(hKeyClass,REGSTR_VAL_NODISPLAYCLASS,Nil,Nil,NIl,Nil) = ERROR_SUCCESS; RegCloseKey(hKeyClass); end; end;function TDevForm.IsDevDisable(DevIndex: DWORD; hDevInfo: HDEVINFO): Boolean; var DeviceInfoData: SP_DEVINFO_DATA; Status, Problem: DWORD; begin Result:=False; DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA); if not SetupDiEnumDeviceInfo(hDevInfo,DevIndex,@DeviceInfoData) then Exit; if CM_Get_DevNode_Status(@Status, @Problem, DeviceInfoData.DevInst, 0) <> CR_SUCCESS then Exit; Result:=((Status and DN_DISABLEABLE)<>0) and (CM_PROB_HARDWARE_DISABLED <> Problem); end;function TDevForm.ChangeDevState(DevIndex, NewState: DWORD): BOOL; var DeviceInfoSet: HDEVINFO; DeviceInfoData: SP_DEVINFO_DATA; PropChangeParams: SP_PROPCHANGE_PARAMS; Cursor: HCURSOR; begin Result:=False; DeviceInfoSet:=SetupDiGetClassDevs(Nil,Nil,0,DIGCF_ALLCLASSES or DIGCF_PRESENT); if DeviceInfoSet = Pointer(INVALID_HANDLE_VALUE) then Exit; try PropChangeParams.ClassInstallHeader.cbSize:=SizeOf(SP_CLASSINSTALL_HEADER); DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA); Cursor := SetCursor(LoadCursor(0, IDC_WAIT)); if not SetupDiEnumDeviceInfo(DeviceInfoSet,DevIndex,@DeviceInfoData) then Exit; PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE; PropChangeParams.Scope := DICS_FLAG_GLOBAL; PropChangeParams.StateChange := NewState; if not SetupDiSetClassInstallParams(DeviceInfoSet,@DeviceInfoData, @PropChangeParams,Sizeof(PropChangeParams)) then Exit; if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,DeviceInfoSet, @DeviceInfoData) then Exit; SetCursor(Cursor); Result:=True; finally SetupDiDestroyDeviceInfoList(DeviceInfoSet); end; end;procedure TDevForm.FormCreate(Sender: TObject); begin btRefresh.Click; end;procedure TDevForm.btExitClick(Sender: TObject); begin Close; end;procedure TDevForm.btApplyClick(Sender: TObject); var i: Integer; begin for i:=0 to clbDevList.Count-1 do begin if clbDevList.Checked[i]<>DevState[i] then begin if clbDevList.Checked[i] then ChangeDevState(Cardinal(clbDevList.Items.Objects[i]),DICS_ENABLE) else ChangeDevState(Cardinal(clbDevList.Items.Objects[i]),DICS_DISABLE) end; end; RefreshDevState; end;procedure TDevForm.RefreshDevState; var i: Integer; begin SetLength(DevState,clbDevList.Count); for i:=0 to clbDevList.Count-1 do DevState[i]:=clbDevList.Checked[i]; end;procedure TDevForm.btRefreshClick(Sender: TObject); begin EnumNetDevice; RefreshDevState; end;end.完整的自己上2ccc找
要是想改ip地址就这样 WinExec('netsh interface ip set address 本地连接 static 192.168.1.189 255.255.255.0 192.168.1.1 1',SW_HIDE); 如果想改别的,就在提示符下用netsh命令,进去后看一下帮助
请问shell32.dll如何引用呢?无法编译,我已经uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Shell32_TLB, StdCtrls, Menus;
里面已加入了Shell32_TLB,
100% OK的
unit DeviceForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CheckLst, Common, RegStr;const
DEV_CLASS_NAME = 'Net';
UNKNOWN_DEVICE = '<未知设备>';type
TDevForm = class(TForm)
lbDev: TLabel;
btApply: TButton;
btExit: TButton;
clbDevList: TCheckListBox;
btRefresh: TButton;
procedure FormCreate(Sender: TObject);
procedure btExitClick(Sender: TObject);
procedure btApplyClick(Sender: TObject);
procedure btRefreshClick(Sender: TObject);
private
{ Private declarations }
DevState: Array of Boolean;
procedure RefreshDevState; procedure EnumNetDevice;
function IsClassHidden(const ClassGUID: PGUID): Boolean;
function ConstructDeviceName(DeviceInfoSet: HDEVINFO;
DeviceInfoData: PSP_DEVINFO_DATA; Buffer: PAnsiChar; Length: ULONG): Boolean;
function GetRegistryProperty(DeviceInfoSet: HDEVINFO;
DeviceInfoData: PSP_DEVINFO_DATA; AProperty: ULONG; Buffer: PAnsiChar;
Length: ULONG): Boolean;
function IsDevDisable(DevIndex: DWORD; hDevInfo: HDEVINFO): Boolean;
function ChangeDevState(DevIndex, NewState: DWORD): BOOL;
public
{ Public declarations }
end;var
DevForm: TDevForm;implementation{$R *.dfm}procedure TDevForm.EnumNetDevice;
var
DeviceInfoSet: HDEVINFO;
DeviceInfoData: SP_DEVINFO_DATA;
i: Integer;
Status, Problem: DWORD;
ClassName: PChar;
ClassSize, ReqClassSize: DWORD;
DeviceName: PChar;
begin
clbDevList.Clear; DeviceInfoSet:=SetupDiGetClassDevs(Nil,Nil,0,DIGCF_ALLCLASSES or DIGCF_PRESENT);
if DeviceInfoSet = Pointer(INVALID_HANDLE_VALUE) then
Exit; ClassSize:=255;
GetMem(ClassName,256);
try
DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA); i:=0;
while SetupDiEnumDeviceInfo(DeviceInfoSet,i,@DeviceInfoData) do
begin
Inc(i); if not SetupDiClassNameFromGuid(@DeviceInfoData.ClassGuid,ClassName,ClassSize,
@ReqClassSize) then
begin
if ReqClassSize>ClassSize then
begin
FreeMem(ClassName);
ClassSize:=ReqClassSize;
GetMem(ClassName,ClassSize+1);
if not SetupDiClassNameFromGuid(@DeviceInfoData.ClassGuid,ClassName,ClassSize,
@ReqClassSize) then
Exit;
end
else
Exit;
end; if not SameText(ClassName,DEV_CLASS_NAME) then
Continue; if CM_Get_DevNode_Status(@Status, @Problem, DeviceInfoData.DevInst,0)
<> CR_SUCCESS then
Exit; if ((Status and DN_NO_SHOW_IN_DM)<>0) or
IsClassHidden(@DeviceInfoData.ClassGuid) then
Continue; GetMem(DeviceName,256);
ZeroMemory(DeviceName,256);
ConstructDeviceName(DeviceInfoSet,@DeviceInfoData,DeviceName,255);
clbDevList.Items.AddObject(StrPas(DeviceName),TObject(i-1));
clbDevList.Checked[clbDevList.Count-1]:=IsDevDisable(i-1,DeviceInfoSet);
FreeMem(DeviceName);
end;
finally
FreeMem(ClassName);
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
end;
end;function TDevForm.ConstructDeviceName(DeviceInfoSet: HDEVINFO;
DeviceInfoData: PSP_DEVINFO_DATA; Buffer: PAnsiChar;
Length: ULONG): Boolean;
begin
Result:=True; if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_FRIENDLYNAME,
Buffer,Length) then
begin
if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_DEVICEDESC,
Buffer,Length) then
begin
if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_CLASS,
Buffer,Length) then
begin
if not GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_CLASSGUID,
Buffer,Length) then
begin
StrCopy(Buffer,UNKNOWN_DEVICE);
end
else
Result:=False;
end
end
end;
end;function TDevForm.GetRegistryProperty(DeviceInfoSet: HDEVINFO;
DeviceInfoData: PSP_DEVINFO_DATA; AProperty: ULONG; Buffer: PAnsiChar;
Length: ULONG): Boolean;
var
ReqLen: DWORD;
begin
Result:=False; while not SetupDiGetDeviceRegistryProperty(DeviceInfoSet,DeviceInfoData,
AProperty,Nil,Buffer,Length,@ReqLen) do
begin
if GetLastError() = ERROR_INVALID_DATA then
break
else if GetLastError() = ERROR_INSUFFICIENT_BUFFER then
begin
if Assigned(Buffer) then
FreeMem(Buffer);
Length:=ReqLen;
GetMem(Buffer,Length+1);
end
else
Exit;
end; Result:=Buffer^<>#0;
end;function TDevForm.IsClassHidden(const ClassGUID: PGUID): Boolean;
var
hKeyClass: HKEY;
begin
Result:=False; hKeyClass := SetupDiOpenClassRegKey(ClassGuid,KEY_READ);
if hKeyClass<>0 then
begin
Result:= RegQueryValueEx(hKeyClass,REGSTR_VAL_NODISPLAYCLASS,Nil,Nil,NIl,Nil) = ERROR_SUCCESS;
RegCloseKey(hKeyClass);
end;
end;function TDevForm.IsDevDisable(DevIndex: DWORD;
hDevInfo: HDEVINFO): Boolean;
var
DeviceInfoData: SP_DEVINFO_DATA;
Status, Problem: DWORD;
begin
Result:=False;
DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA); if not SetupDiEnumDeviceInfo(hDevInfo,DevIndex,@DeviceInfoData) then
Exit; if CM_Get_DevNode_Status(@Status, @Problem, DeviceInfoData.DevInst, 0) <> CR_SUCCESS then
Exit; Result:=((Status and DN_DISABLEABLE)<>0) and (CM_PROB_HARDWARE_DISABLED <> Problem);
end;function TDevForm.ChangeDevState(DevIndex, NewState: DWORD): BOOL;
var
DeviceInfoSet: HDEVINFO;
DeviceInfoData: SP_DEVINFO_DATA;
PropChangeParams: SP_PROPCHANGE_PARAMS;
Cursor: HCURSOR;
begin
Result:=False; DeviceInfoSet:=SetupDiGetClassDevs(Nil,Nil,0,DIGCF_ALLCLASSES or DIGCF_PRESENT);
if DeviceInfoSet = Pointer(INVALID_HANDLE_VALUE) then
Exit; try
PropChangeParams.ClassInstallHeader.cbSize:=SizeOf(SP_CLASSINSTALL_HEADER);
DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA); Cursor := SetCursor(LoadCursor(0, IDC_WAIT)); if not SetupDiEnumDeviceInfo(DeviceInfoSet,DevIndex,@DeviceInfoData) then
Exit; PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
PropChangeParams.Scope := DICS_FLAG_GLOBAL;
PropChangeParams.StateChange := NewState; if not SetupDiSetClassInstallParams(DeviceInfoSet,@DeviceInfoData,
@PropChangeParams,Sizeof(PropChangeParams)) then
Exit; if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,DeviceInfoSet,
@DeviceInfoData) then
Exit; SetCursor(Cursor);
Result:=True;
finally
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
end;
end;procedure TDevForm.FormCreate(Sender: TObject);
begin
btRefresh.Click;
end;procedure TDevForm.btExitClick(Sender: TObject);
begin
Close;
end;procedure TDevForm.btApplyClick(Sender: TObject);
var
i: Integer;
begin
for i:=0 to clbDevList.Count-1 do
begin
if clbDevList.Checked[i]<>DevState[i] then
begin
if clbDevList.Checked[i] then
ChangeDevState(Cardinal(clbDevList.Items.Objects[i]),DICS_ENABLE)
else
ChangeDevState(Cardinal(clbDevList.Items.Objects[i]),DICS_DISABLE)
end;
end;
RefreshDevState;
end;procedure TDevForm.RefreshDevState;
var
i: Integer;
begin
SetLength(DevState,clbDevList.Count);
for i:=0 to clbDevList.Count-1 do
DevState[i]:=clbDevList.Checked[i];
end;procedure TDevForm.btRefreshClick(Sender: TObject);
begin
EnumNetDevice;
RefreshDevState;
end;end.完整的自己上2ccc找
WinExec('netsh interface ip set address 本地连接 static 192.168.1.189 255.255.255.0 192.168.1.1 1',SW_HIDE);
如果想改别的,就在提示符下用netsh命令,进去后看一下帮助