写了一个动态链接库,在动态链接库中利用链表保存了从设备管理器里查询到的USB设备类的名称,但是在调用该动态链接库的时候总是得不到结果。动态链接库中的代码和调用程序的代码如下:
dll:
DEVICE_API int Devicefind(struct DeviceName *head)
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
GUID classGuid=GUID_DEVCLASS_USB;//USB类的guid
//获取系统硬件设备集
//hDevInfo=SetupDiGetClassDevs(NULL,0,0,DIGCF_PRESENT|DIGCF_ALLCLASSES);//获取系统当前所有硬件设备集
hDevInfo=SetupDiGetClassDevs((LPGUID)&classGuid,0,0,DIGCF_PRESENT);//获取所有USB设备
if (hDevInfo==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,_T("获取设备失败!"),_T("1"),0);
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
//枚举所有硬件设备
DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer=NULL;
DWORD buffersize=0;
/*************************获取单个设备详细信息********************************/
while (!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_DEVICEDESC,&DataT,(PBYTE)buffer,buffersize,&buffersize))
{
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
//改变缓冲区大小
if (buffer)
LocalFree(buffer);
buffer=(char*)LocalAlloc(LPTR,buffersize);
}
}
struct DeviceName *mbuffer1,*mbuffer2;
mbuffer1=(struct DeviceName*)malloc(sizeof(struct DeviceName));
mbuffer1->name=buffer;//将数据存入链表中
mbuffer1->next=NULL;
if (head==NULL)
head=mbuffer1;
mbuffer2=(struct DeviceName*)malloc(sizeof(struct DeviceName));
mbuffer2->next=mbuffer1;
mbuffer2=mbuffer1;//将mbuffer1的值赋给mbuffer2
if (buffer)
{
LocalFree(buffer);
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);//清理
return 1;
}
调用函数代码:
void CProp1::OnBnClickedBtngetdev()
{
// TODO: 在此添加控件通知处理程序代码
struct DeviceName *pbuffer=NULL;
int result;
result=Devicefind(pbuffer);
if (1==result)
{
MessageBox(_T("获取设备信息成功!"));
}
else
MessageBox(_T("获取设备信息失败!"));
单步调试在dll的cpp文件中,头指针能够得到设备的名称,在调用该dll的函数中得到的结果却为空 |