主题:[讨论]请帮忙看看启用网卡的问题。
LEonEmily
[专家分:0] 发布于 2007-10-15 00:19:00
我写了一个禁用启用网卡的程序,但是这个程序有点小BUG。谁能帮我解决一下。情况如下:
如果网卡在程序运行前就被禁用了,启动程序后能检测到网卡被禁用(以前不能检测到我已经修复了),但是却不能通过该程序启用。但是如果网卡在程序运行前或者程序运行时是启用的,再通过该程序禁用再启用是可以的。
源代码已经附在后面,请好心人帮忙看看。如果知道怎么改得请与我联系,联系方式:
QQ:854474548
E-Mail:rei160027@sina.com
回复列表 (共2个回复)
沙发
wealthy [专家分:1840] 发布于 2007-10-15 10:46:00
我初步看了看,问题应该出在ChangeDevState里,应在开始时应检测网卡之前是否被停用或启用,再判断,后根据判断结果来执行最终结果.
至于点样判断,你网上找找看.
板凳
LEonEmily [专家分:0] 发布于 2007-10-15 16:29:00
谢谢你的帮助,我今天按照你的方法看了一下,又在网上找了点资料。问题的确出现在ChangeDevState里面,但是不是你说的判断问题。问题出现在没有把修改的文件保存在属性文件中,今天我又把ChangeDevState给修改了一下。现在已经不存在以前的问题了。原始ChangeDevState,修改后的ChangeDevState如下:
原始ChangeDevState
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;
[color=FF0000]PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
PropChangeParams.Scope := DICS_FLAG_GLOBAL;
PropChangeParams.StateChange := NewState;
if not SetupDiSetClassInstallParams(DeviceInfoSet,@DeviceInfoData,
PSP_CLASSINSTALL_HEADER(@PropChangeParams),Sizeof(PropChangeParams)) then
Exit;
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,DeviceInfoSet,
@DeviceInfoData) then
Exit;
SetCursor(Cursor);
Result:=True;
finally
SetupDiDestroyDeviceInfoList(DeviceInfoSet);[/color]
end;
end;
修改后的ChangeDevState
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
DeviceInfoData.cbSize:=SizeOf(SP_DEVINFO_DATA);
Cursor := SetCursor(LoadCursor(0, IDC_WAIT));//使光标变成沙漏状
if not SetupDiEnumDeviceInfo(DeviceInfoSet,DevIndex,@DeviceInfoData) then
Exit;
[color=FF0000]PropChangeParams.ClassInstallHeader.cbSize:=SizeOf(SP_CLASSINSTALL_HEADER);
PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
PropChangeParams.Scope := DICS_FLAG_GLOBAL;
PropChangeParams.StateChange := NewState;
PropChangeParams.HwProfile := 0;
//改变设备属性
if not SetupDiSetClassInstallParams(DeviceInfoSet,@DeviceInfoData,
PSP_CLASSINSTALL_HEADER(@PropChangeParams),Sizeof(PropChangeParams)) then
Exit;
PropChangeParams.ClassInstallHeader.cbSize:=SizeOf(SP_CLASSINSTALL_HEADER);
PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
PropChangeParams.Scope := DICS_FLAG_CONFIGSPECIFIC;//使修改的属性保存在指定的属性文件
PropChangeParams.StateChange := NewState;
PropChangeParams.HwProfile := 0;
//改变设备属性并调用安装服务
if not SetupDiSetClassInstallParams(DeviceInfoSet,@DeviceInfoData,
PSP_CLASSINSTALL_HEADER(@PropChangeParams),Sizeof(PropChangeParams)) then
Exit;
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,DeviceInfoSet,
@DeviceInfoData) then
Exit;
Result:=True;
finally
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
SetCursor(Cursor);//使光标更晚的变化[/color]
end;
end;
我来回复