用了sczyq(我又...........) 的紧用和启动网卡的程序,并且安装了DDK,包含文件都弄好了,可是报错是怎么回事。我是初级菜鸟,请大家指教

hzoll2 2003-11-28 11:43:58
/*

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

*/

#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;
}


报错全在cfgmgr32.h文件中
[C++ Error] cfgmgr32.h(2416): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'
[C++ Error] cfgmgr32.h(2427): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'
[C++ Error] cfgmgr32.h(2438): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'
[C++ Error] cfgmgr32.h(2450): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'
[C++ Error] cfgmgr32.h(2473): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'
[C++ Error] cfgmgr32.h(2484): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'

请指教,谢谢。。。
...全文
69 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouwx 2004-01-16
  • 打赏
  • 举报
回复
DDK那里有,我找了好几天了.发一个给我把,谢谢!ouwx@5218.cn
netsys2 2003-11-28
  • 打赏
  • 举报
回复
你得留言给他,他不是天天来的。
sczyq 2003-11-28
  • 打赏
  • 举报
回复
禁用序号为n的网卡:

NetCardStateChange(NetCardList->Items[n],false);
sczyq 2003-11-28
  • 打赏
  • 举报
回复
你说怎么使用两个函数:

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];

sczyq 2003-11-28
  • 打赏
  • 举报
回复
同意gycxy(静水),事实正是由此而起。


[C++ Error] cfgmgr32.h(2416): E2015 Ambiguity between 'PHKEY' and 'Windows::PHKEY'

这是说明cfgmgr32.h 里第2416行 PHKEY 的数据类型的名称与Windows类的PHKEY重复了,你得找到cfgmgr32.h里出现PHKEY的地方(应该是6处,行号就是括号里的),改成 Windows::PHKEY

如:
CM_Open_Class_KeyA(
IN LPGUID ClassGuid, OPTIONAL
IN LPCSTR pszClassName, OPTIONAL
IN REGSAM samDesired,
IN REGDISPOSITION Disposition,
OUT Windows::PHKEY phkClass, // 这是第2416行,加上Windows::
IN ULONG ulFlags
);


以下错误是因为上面的错误引起的.
[C++ Error] Unit1.cpp(37): E2451 Undefined symbol 'brvbar'
.............


gycxy 2003-11-28
  • 打赏
  • 举报
回复
我觉得是你包含的PHKEY定义有多个,看看你的包含文件或包含的顺序

1,317

社区成员

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

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