回 帖 发 新 帖 刷新版面

主题:[讨论]请帮忙看看启用网卡的问题。

我写了一个禁用启用网卡的程序,但是这个程序有点小BUG。谁能帮我解决一下。情况如下:
如果网卡在程序运行前就被禁用了,启动程序后能检测到网卡被禁用(以前不能检测到我已经修复了),但是却不能通过该程序启用。但是如果网卡在程序运行前或者程序运行时是启用的,再通过该程序禁用再启用是可以的。
源代码已经附在后面,请好心人帮忙看看。如果知道怎么改得请与我联系,联系方式:
QQ:854474548
E-Mail:rei160027@sina.com

回复列表 (共2个回复)

沙发

我初步看了看,问题应该出在ChangeDevState里,应在开始时应检测网卡之前是否被停用或启用,再判断,后根据判断结果来执行最终结果.

至于点样判断,你网上找找看.

板凳



谢谢你的帮助,我今天按照你的方法看了一下,又在网上找了点资料。问题的确出现在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;

我来回复

您尚未登录,请登录后再回复。点此登录或注册