请问如何启用和禁用网络连接?谢谢

huxiaoye 2004-03-02 05:35:09
请问如何启用和禁用网络连接?谢谢
...全文
105 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sczyq 2004-06-15
  • 打赏
  • 举报
回复
15分,糟塌了我的贴子!
hzoll 2004-04-24
  • 打赏
  • 举报
回复
这个也是前人的辛苦成果,好久以前的了,我收藏了一下:)
但好象只能在NT结构的系统中,我自己用,好使的,不过不是紧用网络连接,而是紧用的网卡!
cfgmgr32.h需要安装编写驱动程序的程序,里头有这个文件,考过来,还有cfgmgr32.h里用到的几个文件当然也要考过来啦:)


/*



还是帖出来吧, 我可是花了三天时间才搞定了.



*/



#include <SetupAPI.h>

#include <cfgmgr32.h> // cfgmgr32.h 在Microsoft Windows 2000 DDK 中.

// 要用 CM_Get_DevNode_Status(...) 来查询状态.

//---------------------------------------------------------------------------

typedef struct NetCardStruct

{

DWORD Id; // 网卡设备号

AnsiString Name; // 网卡名

bool Disabled; // 当前是否禁用

bool Changed; // 是否更改过

} TNetCardStruct;

typedef TNetCardStruct* PNetCardStruct;

//---------------------------------------------------------------------------

// EnumNetCards 枚举出网卡

//---------------------------------------------------------------------------

void __fastcall EnumNetCards(TList *NetDeviceList)

{

AnsiString DevValue;

PNetCardStruct NetCard;

DWORD Status, Problem;

LPTSTR Buffer = NULL;

DWORD BufSize = 0;

HDEVINFO hDevInfo = 0;

if (INVALID_HANDLE_VALUE == (hDevInfo =

SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES)))

return;

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};

HKEY hKeyClass;

char DeviceName[200];

for (DWORD DeviceId=0;

SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData); DeviceId++)

{

if (CM_Get_DevNode_Status(&Status, &Problem,

DeviceInfoData.DevInst,0) != CR_SUCCESS)

continue;



DevValue.SetLength(0);

if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize))

DevValue = Buffer;

if (DevValue == "Net")

{

DevValue.SetLength(0);

if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize))

DevValue = Buffer;

if (DevValue != "ROOT")

{

NetCard = new TNetCardStruct;

NetCard->Id = DeviceId;

NetCard->Name = "<Unknown Device>";

if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize))

if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize))

NetCard->Name = Buffer;

NetCard->Disabled = (Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem);

NetCard->Changed = false;

NetDeviceList->Add(NetCard);

}

}

}

}

//---------------------------------------------------------------------------

bool __fastcall GetRegistryProperty(HDEVINFO DeviceInfoSet,

PSP_DEVINFO_DATA DeviceInfoData, ULONG Property, PVOID Buffer, PULONG Length)

{

while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,

DeviceInfoData, Property, NULL, (BYTE *)*(TCHAR **)Buffer, *Length, Length))

{

if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)

{

if (*(LPTSTR *)Buffer) LocalFree(*(LPTSTR *)Buffer);

*(LPTSTR *)Buffer = (PCHAR)LocalAlloc(LPTR,*Length);

}

else return false;

}

return (*(LPTSTR *)Buffer)[0];

}

//---------------------------------------------------------------------------

// NetCardStateChange 网卡的启用与禁用

// NetCardPoint 是 PNetCardStruct 的指针.

// Enabled true = 启用 false = 禁用

//---------------------------------------------------------------------------

bool __fastcall NetCardStateChange(void * NetCardPoint, bool Enabled)

{

PNetCardStruct NetCard = (PNetCardStruct)NetCardPoint;

DWORD DeviceId = NetCard->Id;

HDEVINFO hDevInfo = 0;

if (INVALID_HANDLE_VALUE == (hDevInfo =

SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES)))

return false;

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};

DWORD Status, Problem;

if (!SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData))

return false;



if (CM_Get_DevNode_Status(&Status, &Problem,

DeviceInfoData.DevInst,0) != CR_SUCCESS)

return false;



SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};

PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;

PropChangeParams.Scope = DICS_FLAG_GLOBAL;

if (Enabled)

{

if (!((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem)))

{

NetCard->Disabled = false;

return false;

}

PropChangeParams.StateChange = DICS_ENABLE;

}

else

{

if ((Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem))

{

NetCard->Disabled = true;

return false;

}

if (!((Status & DN_DISABLEABLE) && (CM_PROB_HARDWARE_DISABLED != Problem)))

return false;

PropChangeParams.StateChange = DICS_DISABLE;

}



if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,

(SP_CLASSINSTALL_HEADER *)&PropChangeParams, sizeof(PropChangeParams)))

return false;

if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData))

return false;

if (CM_Get_DevNode_Status(&Status, &Problem,

DeviceInfoData.DevInst,0) == CR_SUCCESS)

NetCard->Disabled = (Status & DN_HAS_PROBLEM) && (CM_PROB_DISABLED == Problem);

return true;

}

你说怎么使用两个函数:

TList *NetCardList = new TList;
EunmNetCards(NetCardList);

// 列出
for (int i=0; i<NetCardList->Count; i++)
{
PNetCardStruct AStruct = (PNetCardStruct)NetCardList->Items[i];
Memo1->Lines->Add("---------------");
Memo1->Lines->Add("网卡序号:" + IntToStr(i));
Memo1->Lines->Add("网卡设备号: " + IntToStr((int)AStruct->Id));
Memo1->Lines->Add("网卡设备名: " + AStruct->Name);
if (AStruct->Disabled) Memo1->Lines->Add("状态: 禁用");
else Memo1->Lines->Add("状态: 启用");
}


// 删除由EunmNetCards分配的内存
for (int i=0; i<NetCardList->Count; i++)
delete (PNetCardStruct)NetCardList->Items[i];





禁用序号为n的网卡:

NetCardStateChange(NetCardList->Items[n],false);

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧