新建的空Win32 Application项目文件,然后添加了如下两个文件至项目中,main.h中的各种预定义都是从一个名为Setupapi.h的头文件中切出来的.main.cpp只有一个WinMain函数,在该函数中调用了一个DiChangeState函数.请各位大虾帮忙.// main.cpp
#include <windows.h>
#include "main.h"int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
LPDEVICE_INFO lpid; lpid=(LPDEVICE_INFO)malloc(sizeof(DEVICE_INFO));
DiChangeState(lpid,DICS_DISABLE,DICS_FLAG_GLOBAL,0);
return 0;
}
// main.h
#pragma comment(lib,"setupapi.lib")
#pragma comment(lib,"setupext.lib")
#pragma comment(lib,"rasapi32.lib")
#pragma comment(lib,"sampcpl.lib")
#pragma comment(lib,"sampusd.lib")
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"smmhook.lib")
#pragma comment(lib,"sampcpl.lib")
#pragma comment(lib,"spoolss.lib")
#pragma comment(lib,"sti.lib")
#pragma comment(lib,"stream.lib")
#pragma comment(lib,"uniime.lib")
#pragma comment(lib,"usbcamd.lib")
#pragma comment(lib,"usbd.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"version.lib")
#pragma comment(lib,"vkd.lib")
#pragma comment(lib,"vpacket.lib")
// #pragma comment(lib,"vxdwraps.lib")
#pragma comment(lib,"wdm.lib")
// #pragma comment(lib,"wdmvxd.lib")
#pragma comment(lib,"wingb.lib")
#pragma comment(lib,"winmm.lib")
// 一些类型预定义
typedef unsigned int UINT;
typedef UINT RETERR;
typedef UINT LOGDISKID; 
typedef DWORD LPEXPANDVTBL;// 一些常数预定义
#define LINE_LEN                80
#define MAX_DEVNODE_ID_LEN     256
#define MAX_CLASS_NAME_LEN      32
#define MAX_GUID_STR            50// DiChangeState函数要用的常数
#define DICS_FLAG_GLOBAL         0x00000001
#define DICS_DISABLE             0x00000002// GENCALLBACKINFO_S结构
typedef struct _GENCALLBACKINFO_S { /* gen-callback struc */
    WORD         cbSize;                 // Size of this structure (bytes).
    WORD         wOperation;             // Operation being performed.
    LOGDISKID    ldidSrc;                // Logical Disk ID for Source.
    LPCSTR       pszSrcSubDir;           // Source sub-dir off of the LDID.
    LPCSTR       pszSrcFileName;         // Source file name (base name).
    LOGDISKID    ldidDst;                // Logical Disk ID for Dest.
    LPCSTR       pszDstSubDir;           // Dest. sub-dir off of the LDID.
    LPCSTR       pszDstFileName;         // Dest. file name (base name).
    LPEXPANDVTBL lpExpandVtbl;           // BUGBUG needed? NULL right now!
    WORD         wflags;                 // flags for VcpQueueCopy.
    LPARAM       lParam;                 // LPARAM to the Vcp API.
} GENCALLBACKINFO_S, FAR *LPGENCALLBACKINFO;// GENCALLBACKPROC预定义
typedef LRESULT (CALLBACK *GENCALLBACKPROC)(LPGENCALLBACKINFO lpGenInfo,LPARAM lparamRef);// DRIVER_NODE结构
typedef struct _DRIVER_NODE {
    struct _DRIVER_NODE FAR* lpNextDN;
    UINT    Rank;
    UINT    InfType;
    unsigned    InfDate;
    LPSTR   lpszDescription;        // Compatibility: Contains the Device Desc.
    LPSTR   lpszSectionName;
    ATOM    atInfFileName;
    ATOM    atMfgName;
    ATOM    atProviderName;
    DWORD   Flags;
    DWORD   dwPrivateData;
    LPSTR   lpszDrvDescription;     // New contains an driver description
    LPSTR   lpszHardwareID;
    LPSTR   lpszCompatIDs;
    unsigned    DriverDate;
    LPSTR   lpszInfPath;
    LPARAM  lpReserved;
}   DRIVER_NODE, NEAR* PDRIVER_NODE, FAR* LPDRIVER_NODE, FAR* FAR* LPLPDRIVER_NODE;// DRIVER_INFO结构
typedef struct _DRIVER_INFO
{
    WORD                        cbSize;                     // Size of this structure in bytes
    struct _DRIVER_INFO FAR*    lpNextInfo;
    LPSTR                       lpszDescription;
    LPSTR                       lpszMfgName;
    LPSTR                       lpszProviderName;           // ONLY valid if DI_MULTMFGS is set in the LPDI
    WORD                        Rank;
    DWORD                       dwFlags;
    LPARAM                      lpReserved;
    DWORD                       dwPrivateData;
    WORD                        wDate;                      // Driver Date
    LPSTR                       lpszVersion;
} DRIVER_INFO, *PDRIVER_INFO, FAR *LPDRIVER_INFO;// DEVICE_INFO结构
typedef struct _DEVICE_INFO
{
    UINT                        cbSize;
    struct _DEVICE_INFO FAR     *lpNextDi;
    char                        szDescription[LINE_LEN];
    DWORD                       dnDevnode;
    HKEY                        hRegKey;
    char                        szRegSubkey[MAX_DEVNODE_ID_LEN];
    char                        szClassName[MAX_CLASS_NAME_LEN];
    DWORD                       Flags;
    HWND                        hwndParent;
    LPDRIVER_NODE               lpCompatDrvList;
    LPDRIVER_NODE               lpClassDrvList;
    LPDRIVER_NODE               lpSelectedDriver;
    ATOM                        atDriverPath;
    ATOM                        atTempInfFile;
    HINSTANCE                   hinstClassInstaller;
    HINSTANCE                   hinstClassPropProvidor;
    HINSTANCE                   hinstDevicePropProvidor;
    HINSTANCE                   hinstBasicPropProvidor;
    FARPROC                     fpClassInstaller;
    FARPROC                     fpClassEnumPropPages;
    FARPROC                     fpDeviceEnumPropPages;
    FARPROC                     fpEnumBasicProperties;
    DWORD                       dwSetupReserved;
    DWORD                       dwClassInstallReserved;
    GENCALLBACKPROC             gicpGenInstallCallBack;    LPARAM                      gicplParam;
    UINT                        InfType;    HINSTANCE                   hinstPrivateProblemHandler;
    FARPROC                     fpPrivateProblemHandler;
    LPARAM                      lpClassInstallParams;
    struct _DEVICE_INFO FAR     *lpdiChildList;
    DWORD                       dwFlagsEx;
    LPDRIVER_INFO               lpCompatDrvInfoList;
    LPDRIVER_INFO               lpClassDrvInfoList;
    char                        szClassGUID[MAX_GUID_STR];
} DEVICE_INFO, FAR * LPDEVICE_INFO, FAR * FAR * LPLPDEVICE_INFO;RETERR WINAPI DiChangeState(LPDEVICE_INFO lpdi, DWORD dwStateChange, DWORD dwFlags, LPARAM lParam);在VC集成环境中按F7后提示:
Linking...
main.obj : error LNK2001: unresolved external symbol "unsigned int __stdcall DiChangeState(struct _DEVICE_INFO *,unsigned long,unsigned long,long)" (?DiChangeState@@YGIPAU_DEVICE_INFO@@KKJ@Z)
Debug/DisableD.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...DisableD.exe - 2 error(s), 0 warning(s)

解决方案 »

  1.   

    别人提供Setupapi.h同时应该也会提供一个.dll之类的文件吧,DiChangeState函数的实现应该就在那个文件中,找到该文件把它加入工程。
      

  2.   

    vc Menu
    project->setting->link
    add your ???.lib
      

  3.   

    To所有楼上的:
    大家没看到如下代码声明了所需要的*.lib文件吗?也就是说我已经引入了所需的*.lib.
    #pragma comment(lib,"setupapi.lib")
    #pragma comment(lib,"setupext.lib")
    #pragma comment(lib,"rasapi32.lib")
    #pragma comment(lib,"sampcpl.lib")
    #pragma comment(lib,"sampusd.lib")
    #pragma comment(lib,"shell32.lib")
    #pragma comment(lib,"smmhook.lib")
    #pragma comment(lib,"sampcpl.lib")
    #pragma comment(lib,"spoolss.lib")
    #pragma comment(lib,"sti.lib")
    #pragma comment(lib,"stream.lib")
    #pragma comment(lib,"uniime.lib")
    #pragma comment(lib,"usbcamd.lib")
    #pragma comment(lib,"usbd.lib")
    #pragma comment(lib,"user32.lib")
    #pragma comment(lib,"version.lib")
    #pragma comment(lib,"vkd.lib")
    #pragma comment(lib,"vpacket.lib")
    // #pragma comment(lib,"vxdwraps.lib")
    #pragma comment(lib,"wdm.lib")
    // #pragma comment(lib,"wdmvxd.lib")
    #pragma comment(lib,"wingb.lib")
    #pragma comment(lib,"winmm.lib")