鱼C论坛

 找回密码
 立即注册
查看: 2930|回复: 1

error2019问题

[复制链接]
发表于 2016-4-27 21:14:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <devguid.h>
#include <regstr.h>
/* 函数声明 */
BOOL EnumPresentDevice( const GUID * InterfaceClassGuid );
BOOL EnumAllDevice();
/*************************************
* BOOL EnumClassDevice( const GUID * InterfaceClassGuid )
* 功能        根据类型列举当前存在的设备
* 参数        InterfaceClassGuid,所需列举设备接口类的GUID
**************************************/
BOOL EnumClassDevice( const GUID * InterfaceClassGuid )

{
        HDEVINFO DeviceInfoSet;
        HDEVINFO NewDeviceInfoSet;

        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
        PSP_DEVICE_INTERFACE_DETAIL_DATA lpDeviceInterfaceDetailData;

        DWORD dwBufferSize = 0;
        DWORD i;
        // 创建空设备信息列表
        DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL);

        if(DeviceInfoSet == INVALID_HANDLE_VALUE) 
        {
                printf("CreateDeviceInfoList failed: %d\n", GetLastError());
                return 0;
        }

        // 根据接口类型获得新的设备信息列表

        NewDeviceInfoSet = SetupDiGetClassDevsEx(
                InterfaceClassGuid,
                NULL,
                NULL,
                DIGCF_PRESENT | DIGCF_DEVICEINTERFACE,
                DeviceInfoSet,// 之前创建的设备信息列表
                NULL,
                NULL
                );
        if(NewDeviceInfoSet == INVALID_HANDLE_VALUE)
        {
                printf( "SetupDiGetClassDevsEx failed: %d\n", GetLastError() );
                return 0;
        }
        // 设置 SP_DEVICE_INTERFACE_DATA 大小
        DeviceInterfaceData.cbSize 
                = sizeof(SP_DEVICE_INTERFACE_DATA);

        for (i=0; ;i++)
        {
                // 列举接口信息
                BOOL bResult = SetupDiEnumDeviceInterfaces(
                        NewDeviceInfoSet,
                        NULL,
                        InterfaceClassGuid,
                        i,
                        &DeviceInterfaceData
                        );
                if(!bResult)
                {
                        if ( GetLastError()!=NO_ERROR &&
                                GetLastError()!=ERROR_NO_MORE_ITEMS )
                        {
                                printf("ERROR: (%d)",GetLastError());
                                return FALSE;
                        }
                        break;
                }
                else
                {
                        // 为PSP_DEVICE_INTERFACE_DETAIL_DATA结构分配内存,填充
                        lpDeviceInterfaceDetailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(
                                GetProcessHeap(), 0,
                                sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
                        lpDeviceInterfaceDetailData->cbSize 
                                = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                        dwBufferSize = lpDeviceInterfaceDetailData->cbSize;
                        // 获得接口详细信息
                        while(!SetupDiGetDeviceInterfaceDetail(
                                NewDeviceInfoSet,
                                &DeviceInterfaceData,
                                lpDeviceInterfaceDetailData,
                                dwBufferSize,
                                &dwBufferSize,
                                NULL))
                        {
                                // 如果内存空间不足,再次分配,直到可以成功调用
                                if(ERROR_INSUFFICIENT_BUFFER==GetLastError())
                                {
                                        lpDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapReAlloc(
                                                GetProcessHeap(), 0, 
                                                lpDeviceInterfaceDetailData, dwBufferSize);
                                        lpDeviceInterfaceDetailData->cbSize 
                                                = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                                }               
                        }
                        // 显示信息
                        printf("DevicePath: %s\n",lpDeviceInterfaceDetailData->DevicePath);
                        // lpDeviceInterfaceDetailData->DevicePath可作为CreateFile的参数,进行IO控制
                        
                        // 释放内存
                        HeapFree(GetProcessHeap(),0,lpDeviceInterfaceDetailData);
                }
        }
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
        return TRUE;
}
/*************************************
* BOOL EnumAllDevice( )
* 功能        列举当前存在的设备
* 返回值        是否成功
**************************************/
BOOL EnumAllDevice()
{
        HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        DWORD i;

        printf("Displaying the Installed Devices\n\n");

        // 得到所有设备 HDEVINFO 
        hDevInfo = SetupDiGetClassDevs(NULL,
                0, // 无类型
                0, // 无回调函数
                DIGCF_PRESENT | DIGCF_ALLCLASSES );
        if (hDevInfo == INVALID_HANDLE_VALUE)
        {
                return FALSE;
        }
        // 循环列举
        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) HeapFree(GetProcessHeap(), 0, buffer);
                                buffer = (LPTSTR)HeapAlloc(GetProcessHeap(), 0,  buffersize);
                        }
                        else
                                break;
                }
// 输出
                printf("GUID:{%.8X-%.4X-%.4X--%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X} "
                        "Device: %s\n",
                        DeviceInfoData.ClassGuid.Data1,
                        DeviceInfoData.ClassGuid.Data2,
                        DeviceInfoData.ClassGuid.Data3,
                        DeviceInfoData.ClassGuid.Data4[0],
                        DeviceInfoData.ClassGuid.Data4[1],
                        DeviceInfoData.ClassGuid.Data4[2],
                        DeviceInfoData.ClassGuid.Data4[3],
                        DeviceInfoData.ClassGuid.Data4[4],
                        DeviceInfoData.ClassGuid.Data4[5],
                        DeviceInfoData.ClassGuid.Data4[6],
                        DeviceInfoData.ClassGuid.Data4[7],buffer);

                if (buffer) HeapFree(GetProcessHeap(), 0, buffer);
        }

        if ( GetLastError()!=NO_ERROR &&
                GetLastError()!=ERROR_NO_MORE_ITEMS )
        {
                return FALSE;
        }
        //  释放
        SetupDiDestroyDeviceInfoList(hDevInfo);
        return TRUE;
}

int main( int argc, char *argv[ ], char *envp[ ] )
{
        // 列举所有设备
        printf("Enumerating All Device\n\n");
        EnumAllDevice();
        // 列举磁盘分卷驱动器设备
        printf("\n\nEnumerating Present Volume \n\n");
        EnumClassDevice(&GUID_DEVINTERFACE_VOLUME);
        return 0;
}
代码是windowsAPI开发详解——函数、接口、编程实例里的
编译没问题,运行结果:
>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiCreateDeviceInfoList@8,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiEnumDeviceInfo@12,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiDestroyDeviceInfoList@4,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiEnumDeviceInterfaces@20,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetDeviceInterfaceDetailA@24,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetClassDevsA@16,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetClassDevsExA@28,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetDeviceRegistryPropertyA@28,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
1>D:\代码\windows_api\Debug\windows_api.exe : fatal error LNK1120: 9 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
上网查说好像是少lib文件,但是我怎么确定到底少的是哪个lib文件?
或者有其他解决方案?

改项目属性里面什么windows和console这个已经试过,无用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-2 00:33:58 | 显示全部楼层
是不是没有引用某个Lib文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 00:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表