| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6775 人关注过本帖
标题:error2019的问题
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:4 
error2019的问题
程序代码:
#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这个已经试过,无用。
2016-04-27 21:19
xx77oo
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-4-23
收藏
得分:0 
...
2016-04-28 08:02
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
加 #pragma comment( lib, "setupapi.lib" )
因为你没把需要的lib库给链接器
2016-04-29 08:23
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 3楼 rjsp
谢谢。
2016-04-29 09:27
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
标记,我最近也遇到这问题……
2016-04-29 12:59
快速回复:error2019的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019988 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved